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
This commit is contained in:
Nicholas Nethercote 2004-08-25 13:43:44 +00:00
parent 29d59df719
commit 2f53ead94d
5 changed files with 41 additions and 4 deletions

View File

@ -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)) {

View File

@ -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

25
memcheck/tests/brk2.c Normal file
View File

@ -0,0 +1,25 @@
#include <stdio.h>
#include <unistd.h>
#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<MAX; i++) {
ptr = sbrk(1);
if (ptr == (void*)-1) {
printf ("sbrk() failed!\n");
return 0;
}
*ptr = 0;
}
return 0;
}

View File

@ -0,0 +1,7 @@
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
malloc/free: in use at exit: 0 bytes in 0 blocks.
malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
For a detailed leak analysis, rerun with: --leak-check=yes
For counts of detected errors, rerun with: -v

View File

@ -0,0 +1 @@
prog: brk2