Issue an error message if then brk segment overflows.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15155 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c
index 2fd37d1..1d4ae61 100644
--- a/coregrind/m_syswrap/syswrap-generic.c
+++ b/coregrind/m_syswrap/syswrap-generic.c
@@ -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) {
diff --git a/memcheck/tests/linux/brk.stderr.exp b/memcheck/tests/linux/brk.stderr.exp
index d0330e5..17d8a70 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 0ac75da..4fb0475 100644
--- a/none/tests/linux/Makefile.am
+++ b/none/tests/linux/Makefile.am
@@ -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 \
diff --git a/none/tests/linux/brk-overflow1.c b/none/tests/linux/brk-overflow1.c
new file mode 100644
index 0000000..187751a
--- /dev/null
+++ b/none/tests/linux/brk-overflow1.c
@@ -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;
+}
diff --git a/none/tests/linux/brk-overflow1.stderr.exp b/none/tests/linux/brk-overflow1.stderr.exp
new file mode 100644
index 0000000..f131579
--- /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 0000000..3f4e311
--- /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 0000000..1a220f8
--- /dev/null
+++ b/none/tests/linux/brk-overflow2.c
@@ -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;
+}
diff --git a/none/tests/linux/brk-overflow2.stderr.exp b/none/tests/linux/brk-overflow2.stderr.exp
new file mode 100644
index 0000000..df62858
--- /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 0000000..f0a1f19
--- /dev/null
+++ b/none/tests/linux/brk-overflow2.vgtest
@@ -0,0 +1 @@
+prog: brk-overflow2