]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
add_mapping_callback on Darwin: also produce a ChangedSeg record in
authorJulian Seward <jseward@acm.org>
Mon, 2 Sep 2013 13:02:02 +0000 (13:02 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 2 Sep 2013 13:02:02 +0000 (13:02 +0000)
the case where V's record of the permissions for a range differs from
that of the kernel's.  The lack of this caused synthetic segfaults
("can't translate here") from m_translate on OSX 10.8 for pretty much
any graphical .

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13522

coregrind/m_aspacemgr/aspacemgr-linux.c

index 970979300fd1d104528d24f8f829da6bcd8b8b96..f1eaed9a25f4ef16047517b443ed5640acf0fbc8 100644 (file)
@@ -3548,9 +3548,10 @@ static void add_mapping_callback(Addr addr, SizeT len, UInt prot,
          }
          return;
 
-      } else if (nsegments[i].kind == SkAnonC ||
-                 nsegments[i].kind == SkFileC ||
-                 nsegments[i].kind == SkShmC)
+      }
+      else if (nsegments[i].kind == SkAnonC ||
+               nsegments[i].kind == SkFileC ||
+               nsegments[i].kind == SkShmC)
       {
          /* Check permissions on client regions */
          // GrP fixme
@@ -3570,6 +3571,20 @@ static void add_mapping_callback(Addr addr, SizeT len, UInt prot,
                                  "mismatch (kernel %x, V %x)\n", 
                                  (void*)nsegments[i].start,
                                  (void*)(nsegments[i].end+1), prot, seg_prot);
+            /* Add mapping for regions with protection changes */
+            ChangedSeg* cs = &css_local[css_used_local];
+            if (css_used_local < css_size_local) {
+               cs->is_added = True;
+               cs->start    = addr;
+               cs->end      = addr + len - 1;
+               cs->prot     = prot;
+               cs->offset   = offset;
+               css_used_local++;
+            } else {
+               css_overflowed = True;
+            }
+           return;
+
          }
 
       } else {