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