[compiler-rt] r187414 - [sanitizer] read() syscall hook.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Tue Jul 30 06:04:43 PDT 2013


Author: eugenis
Date: Tue Jul 30 08:04:43 2013
New Revision: 187414

URL: http://llvm.org/viewvc/llvm-project?rev=187414&view=rev
Log:
[sanitizer] read() syscall hook.

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

Modified: compiler-rt/trunk/include/sanitizer/linux_syscall_hooks.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/linux_syscall_hooks.h?rev=187414&r1=187413&r2=187414&view=diff
==============================================================================
--- compiler-rt/trunk/include/sanitizer/linux_syscall_hooks.h (original)
+++ compiler-rt/trunk/include/sanitizer/linux_syscall_hooks.h Tue Jul 30 08:04:43 2013
@@ -33,6 +33,7 @@ void __sanitizer_syscall_pre_wait4(int p
 void __sanitizer_syscall_pre_waitpid(int pid, int *status, int options);
 void __sanitizer_syscall_pre_clock_gettime(int clk_id, void *tp);
 void __sanitizer_syscall_pre_clock_getres(int clk_id, void *tp);
+void __sanitizer_syscall_pre_read(unsigned int fd, char *buf, size_t count);
 
 void __sanitizer_syscall_post_rt_sigpending(long res, void *p, size_t s);
 void __sanitizer_syscall_post_getdents(long res, int fd, void *dirp, int count);
@@ -46,6 +47,7 @@ void __sanitizer_syscall_post_waitpid(lo
                                       int options);
 void __sanitizer_syscall_post_clock_gettime(long res, int clk_id, void *tp);
 void __sanitizer_syscall_post_clock_getres(long res, int clk_id, void *tp);
+void __sanitizer_syscall_post_read(long res, unsigned int fd, char *buf, size_t count);
 
 // And now a few syscalls we don't handle yet.
 
@@ -268,7 +270,6 @@ void __sanitizer_syscall_post_clock_getr
 #define __sanitizer_syscall_pre_pwritev(...)
 #define __sanitizer_syscall_pre_query_module(...)
 #define __sanitizer_syscall_pre_quotactl(...)
-#define __sanitizer_syscall_pre_read(...)
 #define __sanitizer_syscall_pre_readahead(...)
 #define __sanitizer_syscall_pre_readdir(...)
 #define __sanitizer_syscall_pre_readlink(...)
@@ -645,7 +646,6 @@ void __sanitizer_syscall_post_clock_getr
 #define __sanitizer_syscall_post_readdir(res, ...)
 #define __sanitizer_syscall_post_readlinkat(res, ...)
 #define __sanitizer_syscall_post_readlink(res, ...)
-#define __sanitizer_syscall_post_read(res, ...)
 #define __sanitizer_syscall_post_readv(res, ...)
 #define __sanitizer_syscall_post_reboot(res, ...)
 #define __sanitizer_syscall_post_recvfrom(res, ...)

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=187414&r1=187413&r2=187414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc (original)
+++ compiler-rt/trunk/lib/msan/lit_tests/Linux/syscalls.cc Tue Jul 30 08:04:43 2013
@@ -59,5 +59,10 @@ int main(int argc, char *argv[]) {
   __msan_poison(buf, sizeof(buf));
   __sanitizer_syscall_post_clock_gettime(-1, 0, buf);
   assert(__msan_test_shadow(buf, sizeof(buf)) == 0);
+
+  __msan_poison(buf, sizeof(buf));
+  __sanitizer_syscall_post_read(5, 42, buf, 10);
+  assert(__msan_test_shadow(buf, sizeof(buf)) == 5);
+  
   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=187414&r1=187413&r2=187414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc Tue Jul 30 08:04:43 2013
@@ -161,6 +161,15 @@ POST_SYSCALL(clock_getres)(long res, int
                            struct sanitizer_kernel_timespec *tp) {
   if (res == 0 && tp) POST_WRITE(tp, sizeof(*tp));
 }
+
+PRE_SYSCALL(read)(unsigned int fd, char *buf, uptr count) {
+  if (buf) PRE_WRITE(buf, count);
+}
+
+POST_SYSCALL(read)(long res, unsigned int fd, char *buf, uptr count) {
+  if (res > 0 && buf) POST_WRITE(buf, res);
+}
+
 }  // extern "C"
 
 #undef PRE_SYSCALL





More information about the llvm-commits mailing list