Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Prepare the next release
[simgrid.git] / src / xbt / memory_map.cpp
index fed4b2c..e55ae03 100644 (file)
@@ -209,15 +209,13 @@ XBT_PRIVATE std::vector<VmMap> get_memory_map(pid_t pid)
     memreg.end_addr = vmentries[i].kve_end;
 
     /* Permissions */
-    memreg.prot = 0;
+    memreg.prot = PROT_NONE;
     if (vmentries[i].kve_protection & KVME_PROT_READ)
       memreg.prot |= PROT_READ;
     if (vmentries[i].kve_protection & KVME_PROT_WRITE)
       memreg.prot |= PROT_WRITE;
     if (vmentries[i].kve_protection & KVME_PROT_EXEC)
       memreg.prot |= PROT_EXEC;
-    if (memreg.prot == 0)
-      memreg.prot |= PROT_NONE;
 
     /* Private (copy-on-write) or shared? */
     if (vmentries[i].kve_flags & KVME_FLAG_COW)
@@ -250,6 +248,16 @@ XBT_PRIVATE std::vector<VmMap> get_memory_map(pid_t pid)
         && vmentries[i].kve_flags & KVME_FLAG_GROWS_DOWN)
       memreg.pathname = "[stack]";
 
+    /*
+     * One last dirty modification: remove write permission from shared
+     * libraries private clean pages. This is necessary because simgrid
+     * later identifies mappings based on the permissions that are expected
+     * when running the Linux kernel.
+     */
+    if (vmentries[i].kve_type == KVME_TYPE_VNODE
+        && ! (vmentries[i].kve_flags & KVME_FLAG_NEEDS_COPY))
+      memreg.prot &= ~PROT_WRITE;
+
     ret.push_back(std::move(memreg));
   }
   procstat_freevmmap(prstat, vmentries);