]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Tools using shadow memory can't handle the first 64KB being mapped, because
authorNicholas Nethercote <n.nethercote@gmail.com>
Tue, 2 Dec 2003 14:56:04 +0000 (14:56 +0000)
committerNicholas Nethercote <n.nethercote@gmail.com>
Tue, 2 Dec 2003 14:56:04 +0000 (14:56 +0000)
they rely on this area being unmapped for their quick sanity check.  This
commit make Valgrind refuse to mmap() this area.  Added a regtest for it.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2085

coregrind/vg_syscalls.c
memcheck/tests/Makefile.am
memcheck/tests/zeropage.c [new file with mode: 0644]
memcheck/tests/zeropage.stderr.exp [new file with mode: 0644]
memcheck/tests/zeropage.vgtest [new file with mode: 0644]

index a3d48c4662085bdef246884b615b719aa5fea75f..5437d5085654e1d83533a0514180513edf699d08 100644 (file)
@@ -3204,6 +3204,14 @@ PRE(mkdir)
    SYSCALL_TRACK( pre_mem_read_asciiz, tid, "mkdir(pathname)", arg1 );
 }
 
+void check_mmap_start(ThreadState* tst, Addr start, Int flags)
+{
+   /* Refuse to mmap the first 64KB of memory, so that the cheap sanity test 
+      for tools using shadow memory works. */
+   if (start < 65536 && (flags & VKI_MAP_FIXED))
+      tst->m_eax = -VKI_EINVAL;
+}
+
 PRE(mmap2)
 {
    /* My impression is that this is exactly like __NR_mmap 
@@ -3214,6 +3222,8 @@ PRE(mmap2)
    */
    MAYBE_PRINTF("mmap2 ( %p, %d, %d, %d, %d, %d )\n",
                arg1, arg2, arg3, arg4, arg5, arg6 );
+
+   check_mmap_start(tst, arg1, arg4);
 }
 
 POST(mmap2)
@@ -3240,6 +3250,8 @@ PRE(mmap)
    a6 = arg_block[5];
    MAYBE_PRINTF("mmap ( %p, %d, %d, %d, %d, %d )\n",
                a1, a2, a3, a4, a5, a6 );
+
+   check_mmap_start(tst, a1, a4);
 }
 
 POST(mmap)
index fb8b8a1461c4f039198a16c3a9b6e5cb263227b5..b94f2c16689a9807e3217d2910f75b28b8421448 100644 (file)
@@ -62,7 +62,8 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
        metadata.stderr.exp metadata.stdout.exp metadata.vgtest \
        threadederrno.stderr.exp threadederrno.stdout.exp \
        threadederrno.vgtest \
-       writev.stderr.exp writev.vgtest
+       writev.stderr.exp writev.vgtest \
+       zeropage.stderr.exp zeropage.vgtest
 
 check_PROGRAMS = \
        badaddrvalue badfree badjump badloop badrw brk buflen_check \
@@ -73,7 +74,7 @@ check_PROGRAMS = \
        overlap pushfpopf \
        realloc1 realloc2 realloc3 sigaltstack signal2 supp1 supp2 suppfree \
        trivialleak tronical weirdioctl \
-       mismatches new_override metadata threadederrno writev
+       mismatches new_override metadata threadederrno writev zeropage
 
 AM_CPPFLAGS = -I$(top_srcdir)/include
 AM_CFLAGS   = $(WERROR) -Winline -Wall -Wshadow -g 
@@ -125,6 +126,7 @@ metadata_SOURCES    = metadata.c
 threadederrno_SOURCES  = threadederrno.c
 threadederrno_LDADD    = -lpthread
 writev_SOURCES         = writev.c
+zeropage_SOURCES       = zeropage.c
 
 # C++ ones
 mismatches_SOURCES     = mismatches.cpp
diff --git a/memcheck/tests/zeropage.c b/memcheck/tests/zeropage.c
new file mode 100644 (file)
index 0000000..9892e34
--- /dev/null
@@ -0,0 +1,38 @@
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* The quick sanity check of Memcheck (and other skins with shadow memory)
+   relies on the first 64KB of memory never being used.  So our mmap()
+   refuses to touch this area.  This program tests for that. */
+
+int main(void)
+{
+   /* mmap(0x0, ... FIXED) should fail */
+   int* m = mmap(0x0, 1000000, PROT_READ|PROT_WRITE, 
+                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
+   if (m != (int*)-1)
+      printf("succeeded?!\n");
+
+   /* mmap(0x1000, ... FIXED) should fail */
+        m = mmap((void*)0x1000, 1000000, PROT_READ|PROT_WRITE, 
+                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
+   if (m != (int*)-1)
+      printf("succeeded?!\n");
+
+   /* mmap(0xa000, ... FIXED) should fail */
+        m = mmap((void*)0xa000, 1000000, PROT_READ|PROT_WRITE, 
+                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
+   if (m != (int*)-1)
+      printf("succeeded?!\n");
+
+   /* mmap(0x10000, ... FIXED) should fail */
+        m = mmap((void*)0x10000, 1000000, PROT_READ|PROT_WRITE, 
+                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
+   if (m == (int*)-1)
+      printf("failed?!\n");
+
+   return 0;
+}
diff --git a/memcheck/tests/zeropage.stderr.exp b/memcheck/tests/zeropage.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/zeropage.vgtest b/memcheck/tests/zeropage.vgtest
new file mode 100644 (file)
index 0000000..89038e4
--- /dev/null
@@ -0,0 +1,2 @@
+prog: zeropage
+vgopts: -q