From: <sv...@va...> - 2015-04-29 12:59:24
|
Author: florian Date: Wed Apr 29 13:59:16 2015 New Revision: 15155 Log: Issue an error message if then brk segment overflows. Added: trunk/none/tests/linux/brk-overflow1.c trunk/none/tests/linux/brk-overflow1.stderr.exp trunk/none/tests/linux/brk-overflow1.vgtest trunk/none/tests/linux/brk-overflow2.c trunk/none/tests/linux/brk-overflow2.stderr.exp trunk/none/tests/linux/brk-overflow2.vgtest Modified: trunk/coregrind/m_syswrap/syswrap-generic.c trunk/memcheck/tests/linux/brk.stderr.exp trunk/none/tests/linux/ (props changed) trunk/none/tests/linux/Makefile.am Modified: trunk/coregrind/m_syswrap/syswrap-generic.c ============================================================================== --- trunk/coregrind/m_syswrap/syswrap-generic.c (original) +++ trunk/coregrind/m_syswrap/syswrap-generic.c Wed Apr 29 13:59:16 2015 @@ -1185,7 +1185,7 @@ /* Set the new data segment end to NEWBRK. If this succeeds, return NEWBRK, else return the current data segment end. */ -static Addr do_brk ( Addr newbrk ) +static Addr do_brk ( Addr newbrk, ThreadId tid ) { NSegment const* aseg; Addr newbrkP; @@ -1254,10 +1254,17 @@ vg_assert(delta > 0); vg_assert(VG_IS_PAGE_ALIGNED(delta)); - Bool overflow; // ignored here + Bool overflow; if (! VG_(am_extend_into_adjacent_reservation_client)( aseg->start, delta, - &overflow)) + &overflow)) { + if (overflow) + VG_(umsg)("brk segment overflow in thread #%d: can't grow to %#lx\n", + tid, newbrkP); + else + VG_(umsg)("Cannot map memory to grow brk segment in thread #%d " + "to %#lx\n", tid, newbrkP); goto bad; + } VG_(brk_limit) = newbrk; return newbrk; @@ -2997,7 +3004,7 @@ PRINT("sys_brk ( %#lx )", ARG1); PRE_REG_READ1(unsigned long, "brk", unsigned long, end_data_segment); - brk_new = do_brk(ARG1); + brk_new = do_brk(ARG1, tid); SET_STATUS_Success( brk_new ); if (brk_new == ARG1) { Modified: trunk/memcheck/tests/linux/brk.stderr.exp ============================================================================== --- trunk/memcheck/tests/linux/brk.stderr.exp (original) +++ trunk/memcheck/tests/linux/brk.stderr.exp Wed Apr 29 13:59:16 2015 @@ -1,4 +1,6 @@ +brk segment overflow in thread #1: can't grow to 0x........ +brk segment overflow in thread #1: can't grow to 0x........ HEAP SUMMARY: in use at exit: ... bytes in ... blocks Modified: trunk/none/tests/linux/Makefile.am ============================================================================== --- trunk/none/tests/linux/Makefile.am (original) +++ trunk/none/tests/linux/Makefile.am Wed Apr 29 13:59:16 2015 @@ -5,6 +5,8 @@ EXTRA_DIST = \ blockfault.stderr.exp blockfault.vgtest \ + brk-overflow1.stderr.exp brk-overflow1.vgtest \ + brk-overflow2.stderr.exp brk-overflow2.vgtest \ mremap.stderr.exp mremap.stderr.exp-glibc27 mremap.stdout.exp \ mremap.vgtest \ mremap2.stderr.exp mremap2.stdout.exp mremap2.vgtest \ @@ -14,6 +16,8 @@ check_PROGRAMS = \ blockfault \ + brk-overflow1 \ + brk-overflow2 \ mremap \ mremap2 \ mremap3 \ Added: trunk/none/tests/linux/brk-overflow1.c ============================================================================== --- trunk/none/tests/linux/brk-overflow1.c (added) +++ trunk/none/tests/linux/brk-overflow1.c Wed Apr 29 13:59:16 2015 @@ -0,0 +1,12 @@ +#include <unistd.h> + +volatile void *ptr; + +/* The default size of the brk segment is 8 MB. + Request more than that in a single request. */ +int main() +{ + ptr = sbrk(9*1024*1024); + + return 0; +} Added: trunk/none/tests/linux/brk-overflow1.stderr.exp ============================================================================== --- trunk/none/tests/linux/brk-overflow1.stderr.exp (added) +++ trunk/none/tests/linux/brk-overflow1.stderr.exp Wed Apr 29 13:59:16 2015 @@ -0,0 +1,3 @@ + +brk segment overflow in thread #1: can't grow to 0x........ + Added: trunk/none/tests/linux/brk-overflow1.vgtest ============================================================================== --- trunk/none/tests/linux/brk-overflow1.vgtest (added) +++ trunk/none/tests/linux/brk-overflow1.vgtest Wed Apr 29 13:59:16 2015 @@ -0,0 +1 @@ +prog: brk-overflow1 Added: trunk/none/tests/linux/brk-overflow2.c ============================================================================== --- trunk/none/tests/linux/brk-overflow2.c (added) +++ trunk/none/tests/linux/brk-overflow2.c Wed Apr 29 13:59:16 2015 @@ -0,0 +1,14 @@ +#include <unistd.h> + +volatile void *ptr; + +/* The default size of the brk segment is 8 MB. + Request more than that in a sequence of requests */ +int main() +{ + int i; + for (i=0; i < 10; ++i) { + ptr = sbrk(1024*1024); + } + return 0; +} Added: trunk/none/tests/linux/brk-overflow2.stderr.exp ============================================================================== --- trunk/none/tests/linux/brk-overflow2.stderr.exp (added) +++ trunk/none/tests/linux/brk-overflow2.stderr.exp Wed Apr 29 13:59:16 2015 @@ -0,0 +1,5 @@ + +brk segment overflow in thread #1: can't grow to 0x........ +brk segment overflow in thread #1: can't grow to 0x........ +brk segment overflow in thread #1: can't grow to 0x........ + Added: trunk/none/tests/linux/brk-overflow2.vgtest ============================================================================== --- trunk/none/tests/linux/brk-overflow2.vgtest (added) +++ trunk/none/tests/linux/brk-overflow2.vgtest Wed Apr 29 13:59:16 2015 @@ -0,0 +1 @@ +prog: brk-overflow2 |