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