PERFORCE change 169130 for review

Stanislav Sedov stas at FreeBSD.org
Fri Oct 2 14:42:50 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=169130

Change 169130 by stas at stas_yandex on 2009/10/02 14:42:33

	- Add the workaround for memcheck's mprotect issue.  Memcheck
	  tracking scheme doesn't allow to mark memory bytes as
	  unaddressable and defined simultaneously so if we mark
	  them unaccessible on mprotect with PROT_NONE we loose
	  any information on definiteness.  So don't alter flags
	  at all of permissions get decreased and operate only on
	  unaccessible bytes if additional read/write permissions
	  were granted.

Affected files ...

.. //depot/projects/valgrind/memcheck/mc_main.c#6 edit

Differences ...

==== //depot/projects/valgrind/memcheck/mc_main.c#6 (text+ko) ====

@@ -1635,13 +1635,38 @@
    }
 }
 
+static void make_mem_defined_if_unaddressable ( Addr a, SizeT len )
+{
+   SizeT i;
+   UChar vabits2;
+   DEBUG("make_mem_defined_if_unaddressable(%p, %llu)\n", a, (ULong)len);
+   for (i = 0; i < len; i++) {
+      vabits2 = get_vabits2( a+i );
+      if (vabits2 == VA_BITS2_NOACCESS) {
+         set_vabits2(a+i, VA_BITS2_DEFINED);
+         if (UNLIKELY(MC_(clo_mc_level) >= 3)) {
+            MC_(helperc_b_store1)( a+i, 0 ); /* clear the origin tag */
+         } 
+      }
+   }
+}
+
 /* Track changes in the virtual memory space. */
 static void track_perms_change( Addr a, SizeT len,
                       Bool rr, Bool ww, Bool xx )
 {
+/*
    if (!(rr || ww))
       MC_(make_mem_noaccess) ( a, len );
-   MC_(make_mem_defined) ( a, len );
+*/
+   /*
+    * Valgrind's memory management implementation is brain-damaged
+    * so we can't mark memory as unaccessible but defined :-(
+    * Thus we don't alter it if the new bits indicate the range
+    * as unaccessible and only change access bits for unaccessible
+    * bytes if permissions were given
+    */
+   make_mem_defined_if_unaddressable ( a, len );
 }
 
 


More information about the p4-projects mailing list