[compiler-rt] r195246 - [msan] Tweak io_submit syscall hook.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Wed Nov 20 05:04:24 PST 2013


Author: eugenis
Date: Wed Nov 20 07:04:23 2013
New Revision: 195246

URL: http://llvm.org/viewvc/llvm-project?rev=195246&view=rev
Log:
[msan] Tweak io_submit syscall hook.

Modified:
    compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc

Modified: compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc?rev=195246&r1=195245&r2=195246&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc (original)
+++ compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc Wed Nov 20 07:04:23 2013
@@ -95,6 +95,13 @@ int main(int argc, char *argv[]) {
   iocb[1].aio_nbytes = kFortyTwo;
   __sanitizer_syscall_post_io_submit(1, 0, 2, &iocbp);
   assert(__msan_test_shadow(buf, sizeof(buf)) == kFortyTwo);
-  
+
+  __msan_poison(buf, sizeof(buf));
+  char *p = buf;
+  __msan_poison(&p, sizeof(p));
+  __sanitizer_syscall_post_io_setup(0, 1, &p);
+  assert(__msan_test_shadow(&p, sizeof(p)) == -1);
+  assert(__msan_test_shadow(buf, sizeof(buf)) >= 32);
+
   return 0;
 }

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc?rev=195246&r1=195245&r2=195246&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc Wed Nov 20 07:04:23 2013
@@ -1245,11 +1245,17 @@ PRE_SYSCALL(flock)(long fd, long cmd) {}
 
 POST_SYSCALL(flock)(long res, long fd, long cmd) {}
 
-PRE_SYSCALL(io_setup)(long nr_reqs, void *ctx) {}
+PRE_SYSCALL(io_setup)(long nr_reqs, void **ctx) {
+  if (ctx) PRE_WRITE(ctx, sizeof(*ctx));
+}
 
-POST_SYSCALL(io_setup)(long res, long nr_reqs, void *ctx) {
+POST_SYSCALL(io_setup)(long res, long nr_reqs, void **ctx) {
   if (res >= 0) {
-    if (ctx) POST_WRITE(ctx, sizeof(long));
+    if (ctx) POST_WRITE(ctx, sizeof(*ctx));
+    // (*ctx) is actually a pointer to a kernel mapped page, and there are
+    // people out there who are crazy enough to peek into that page's 32-byte
+    // header.
+    if (*ctx) POST_WRITE(*ctx, 32);
   }
 }
 





More information about the llvm-commits mailing list