From: Julian Seward Date: Sat, 12 Mar 2005 20:36:15 +0000 (+0000) Subject: Fix silly bug in munmap-implementation which caused massive leakage of X-Git-Tag: svn/VALGRIND_3_0_0~1007 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94c4953bd850e87a7984754b82dce377083b6928;p=thirdparty%2Fvalgrind.git Fix silly bug in munmap-implementation which caused massive leakage of address space :-) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3311 --- diff --git a/coregrind/vg_memory.c b/coregrind/vg_memory.c index 7ecd8a4ffd..f4a0a4d50a 100644 --- a/coregrind/vg_memory.c +++ b/coregrind/vg_memory.c @@ -549,6 +549,7 @@ void VG_(unmap_range)(Addr addr, SizeT len) Segment* s; Addr end, s_end; Int i; + Bool deleted; if (len == 0) return; @@ -565,6 +566,11 @@ void VG_(unmap_range)(Addr addr, SizeT len) vg_assert(IS_PAGE_ALIGNED(len)); for (i = 0; i < segments_used; i++) { + + /* do not delete .. even though it looks stupid */ + vg_assert(i >= 0); + + deleted = False; s = &segments[i]; s_end = s->addr + s->len; @@ -612,6 +618,7 @@ void VG_(unmap_range)(Addr addr, SizeT len) */ dump_translations_from(s); delete_segment_at(i); + deleted = True; if (debug) VG_(printf)(" case 3: seg %d deleted\n", i); @@ -626,11 +633,19 @@ void VG_(unmap_range)(Addr addr, SizeT len) (void)split_segment(addr+len); vg_assert(segments[i_middle].addr == addr); delete_segment_at(i_middle); + deleted = True; if (debug) VG_(printf)(" case 4: subrange %p-%p deleted\n", addr, addr+len); } + + /* If we deleted this segment (or any above), those above will + have been moved down to fill in the hole in the segment + array. In order that we don't miss them, we have to + re-consider this slot number; hence the i--. */ + if (deleted) + i--; } preen_segments(); if (0) show_segments("unmap_range(AFTER)");