From: Nicholas Nethercote Date: Wed, 25 Aug 2004 13:43:44 +0000 (+0000) Subject: Fix problem with brk(). Thanks to Paull Mackerras for the patch. X-Git-Tag: svn/VALGRIND_2_2_0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f53ead94d3a30d737e116aa75690fb19d9b0487;p=thirdparty%2Fvalgrind.git Fix problem with brk(). Thanks to Paull Mackerras for the patch. Added a regression test for it. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2619 --- diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c index 0d87da856e..c279aaee39 100644 --- a/coregrind/vg_syscalls.c +++ b/coregrind/vg_syscalls.c @@ -900,6 +900,8 @@ static Addr do_brk(Addr newbrk) Addr ret = VG_(brk_limit); static const Bool debug = False; Segment *seg; + Addr current, newaddr; + if (debug) VG_(printf)("do_brk: brk_base=%p brk_limit=%p newbrk=%p\n", @@ -922,9 +924,9 @@ static Addr do_brk(Addr newbrk) if (seg != NULL && newbrk > seg->addr) return VG_(brk_limit); - if (PGROUNDDN(newbrk) != PGROUNDDN(VG_(brk_limit))) { - Addr current = PGROUNDUP(VG_(brk_limit)); - Addr newaddr = PGROUNDUP(newbrk); + current = PGROUNDUP(VG_(brk_limit)); + newaddr = PGROUNDUP(newbrk); + if (newaddr != current) { /* new brk in a new page - fix the mappings */ if (newbrk > VG_(brk_limit)) { diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 4d3035ed3b..a8fccb8c55 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -18,6 +18,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ badloop.stderr.exp badloop.vgtest \ badrw.stderr.exp badrw.vgtest \ brk.stderr.exp brk.vgtest \ + brk2.stderr.exp brk2.vgtest \ buflen_check.stderr.exp buflen_check.vgtest \ clientperm.stderr.exp \ clientperm.stdout.exp clientperm.vgtest \ @@ -77,7 +78,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ zeropage.stderr.exp zeropage.vgtest check_PROGRAMS = \ - badaddrvalue badfree badjump badloop badrw brk buflen_check \ + badaddrvalue badfree badjump badloop badrw brk brk2 buflen_check \ clientperm custom_alloc \ doublefree error_counts errs1 exitprog execve execve2 \ fpeflags fprw fwrite inits inline \ @@ -100,6 +101,7 @@ badjump_SOURCES = badjump.c badloop_SOURCES = badloop.c badrw_SOURCES = badrw.c brk_SOURCES = brk.c +brk2_SOURCES = brk2.c buflen_check_SOURCES = buflen_check.c clientperm_SOURCES = clientperm.c custom_alloc_SOURCES = custom_alloc.c diff --git a/memcheck/tests/brk2.c b/memcheck/tests/brk2.c new file mode 100644 index 0000000000..3a881335e4 --- /dev/null +++ b/memcheck/tests/brk2.c @@ -0,0 +1,25 @@ +#include +#include + +#define MAX 3000 + +// At one time, this was causing a seg fault within Valgrind -- it was when +// extending the brk segment onto a new page. Fixed in vg_syscalls.c 1.129. + +int main () { + char* ptr; + int i; + + for (i=0; i