]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Issue an error message if then brk segment overflows.
authorFlorian Krohm <florian@eich-krohm.de>
Wed, 29 Apr 2015 12:59:16 +0000 (12:59 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Wed, 29 Apr 2015 12:59:16 +0000 (12:59 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15155

coregrind/m_syswrap/syswrap-generic.c
memcheck/tests/linux/brk.stderr.exp
none/tests/linux/Makefile.am
none/tests/linux/brk-overflow1.c [new file with mode: 0644]
none/tests/linux/brk-overflow1.stderr.exp [new file with mode: 0644]
none/tests/linux/brk-overflow1.vgtest [new file with mode: 0644]
none/tests/linux/brk-overflow2.c [new file with mode: 0644]
none/tests/linux/brk-overflow2.stderr.exp [new file with mode: 0644]
none/tests/linux/brk-overflow2.vgtest [new file with mode: 0644]

index 2fd37d1cbe65e5f9e3ed5652019f071af1689e1a..1d4ae61e7d9ac4ea1e4af48d24f4eef026860c11 100644 (file)
@@ -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) {
index d0330e591a0e44833a6d9b04930928a6bfd24466..17d8a703d549dbf6dd2dac5f20a761b06721e047 100644 (file)
@@ -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
index 0ac75dacf684c3448b1e2bd1663658b35af84fe1..4fb047558374f2ee0b0533ae426370844b27b0ec 100644 (file)
@@ -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 (file)
index 0000000..187751a
--- /dev/null
@@ -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 (file)
index 0000000..f131579
--- /dev/null
@@ -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 (file)
index 0000000..3f4e311
--- /dev/null
@@ -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 (file)
index 0000000..1a220f8
--- /dev/null
@@ -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 (file)
index 0000000..df62858
--- /dev/null
@@ -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 (file)
index 0000000..f0a1f19
--- /dev/null
@@ -0,0 +1 @@
+prog: brk-overflow2