From 97b35b97f67329507fee3b4b98175fc793942135 Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Wed, 29 Apr 2015 12:59:16 +0000 Subject: [PATCH] Issue an error message if then brk segment overflows. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15155 --- coregrind/m_syswrap/syswrap-generic.c | 15 +++++++++++---- memcheck/tests/linux/brk.stderr.exp | 2 ++ none/tests/linux/Makefile.am | 4 ++++ none/tests/linux/brk-overflow1.c | 12 ++++++++++++ none/tests/linux/brk-overflow1.stderr.exp | 3 +++ none/tests/linux/brk-overflow1.vgtest | 1 + none/tests/linux/brk-overflow2.c | 14 ++++++++++++++ none/tests/linux/brk-overflow2.stderr.exp | 5 +++++ none/tests/linux/brk-overflow2.vgtest | 1 + 9 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 none/tests/linux/brk-overflow1.c create mode 100644 none/tests/linux/brk-overflow1.stderr.exp create mode 100644 none/tests/linux/brk-overflow1.vgtest create mode 100644 none/tests/linux/brk-overflow2.c create mode 100644 none/tests/linux/brk-overflow2.stderr.exp create mode 100644 none/tests/linux/brk-overflow2.vgtest diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 2fd37d1cbe..1d4ae61e7d 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -1185,7 +1185,7 @@ void ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res, /* 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 @@ static Addr do_brk ( Addr newbrk ) 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 @@ PRE(sys_brk) 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) { diff --git a/memcheck/tests/linux/brk.stderr.exp b/memcheck/tests/linux/brk.stderr.exp index d0330e591a..17d8a703d5 100644 --- a/memcheck/tests/linux/brk.stderr.exp +++ b/memcheck/tests/linux/brk.stderr.exp @@ -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 diff --git a/none/tests/linux/Makefile.am b/none/tests/linux/Makefile.am index 0ac75dacf6..4fb0475583 100644 --- a/none/tests/linux/Makefile.am +++ b/none/tests/linux/Makefile.am @@ -5,6 +5,8 @@ dist_noinst_SCRIPTS = filter_stderr 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 @@ EXTRA_DIST = \ check_PROGRAMS = \ blockfault \ + brk-overflow1 \ + brk-overflow2 \ mremap \ mremap2 \ mremap3 \ diff --git a/none/tests/linux/brk-overflow1.c b/none/tests/linux/brk-overflow1.c new file mode 100644 index 0000000000..187751aedd --- /dev/null +++ b/none/tests/linux/brk-overflow1.c @@ -0,0 +1,12 @@ +#include + +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; +} diff --git a/none/tests/linux/brk-overflow1.stderr.exp b/none/tests/linux/brk-overflow1.stderr.exp new file mode 100644 index 0000000000..f1315792ee --- /dev/null +++ b/none/tests/linux/brk-overflow1.stderr.exp @@ -0,0 +1,3 @@ + +brk segment overflow in thread #1: can't grow to 0x........ + diff --git a/none/tests/linux/brk-overflow1.vgtest b/none/tests/linux/brk-overflow1.vgtest new file mode 100644 index 0000000000..3f4e31151d --- /dev/null +++ b/none/tests/linux/brk-overflow1.vgtest @@ -0,0 +1 @@ +prog: brk-overflow1 diff --git a/none/tests/linux/brk-overflow2.c b/none/tests/linux/brk-overflow2.c new file mode 100644 index 0000000000..1a220f81d6 --- /dev/null +++ b/none/tests/linux/brk-overflow2.c @@ -0,0 +1,14 @@ +#include + +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; +} diff --git a/none/tests/linux/brk-overflow2.stderr.exp b/none/tests/linux/brk-overflow2.stderr.exp new file mode 100644 index 0000000000..df6285842f --- /dev/null +++ b/none/tests/linux/brk-overflow2.stderr.exp @@ -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........ + diff --git a/none/tests/linux/brk-overflow2.vgtest b/none/tests/linux/brk-overflow2.vgtest new file mode 100644 index 0000000000..f0a1f19ca2 --- /dev/null +++ b/none/tests/linux/brk-overflow2.vgtest @@ -0,0 +1 @@ +prog: brk-overflow2 -- 2.47.3