]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
backport "calloc does not always zero memory" (v5647)
authorDirk Mueller <daywalker@users.sourceforge.net>
Wed, 22 Feb 2006 13:23:33 +0000 (13:23 +0000)
committerDirk Mueller <daywalker@users.sourceforge.net>
Wed, 22 Feb 2006 13:23:33 +0000 (13:23 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_1_BRANCH@5678

coregrind/m_syswrap/syswrap-generic.c

index ffb1debfafac1051951fd0b2b10290ef65e82961..d1714e19cb6da304c27bd3f021cd01c1b838ca0b 100644 (file)
@@ -947,6 +947,23 @@ static Addr do_brk ( Addr newbrk )
       if (seg && seg->hasT)
          VG_(discard_translations)( newbrk, VG_(brk_limit) - newbrk, 
                                     "do_brk(shrink)" );
+      /* Since we're being lazy and not unmapping pages, we have to
+         zero out the area, so that if the area later comes back into
+         circulation, it will be filled with zeroes, as if it really
+         had been unmapped and later remapped.  Be a bit paranoid and
+         try hard to ensure we're not going to segfault by doing the
+         write - check both ends of the range are in the same segment
+         and that segment is writable. */
+      if (seg) {
+         /* pre: newbrk < VG_(brk_limit) 
+              => newbrk <= VG_(brk_limit)-1 */
+         NSegment* seg2;
+         vg_assert(newbrk < VG_(brk_limit));
+         seg2 = VG_(am_find_nsegment)( VG_(brk_limit)-1 );
+         if (seg2 && seg == seg2 && seg->hasW)
+            VG_(memset)( (void*)newbrk, 0, VG_(brk_limit) - newbrk );
+      }
+
       VG_(brk_limit) = newbrk;
       return newbrk;
    }