From 9fbd981f99d25e878adba159bee50ec15155bf23 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Tue, 30 Jul 2013 13:04:43 +0000 Subject: [PATCH] [sanitizer] read() syscall hook. llvm-svn: 187414 --- compiler-rt/include/sanitizer/linux_syscall_hooks.h | 4 ++-- compiler-rt/lib/msan/lit_tests/Linux/syscalls.cc | 5 +++++ compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/compiler-rt/include/sanitizer/linux_syscall_hooks.h b/compiler-rt/include/sanitizer/linux_syscall_hooks.h index ef8bf72..710e689 100644 --- a/compiler-rt/include/sanitizer/linux_syscall_hooks.h +++ b/compiler-rt/include/sanitizer/linux_syscall_hooks.h @@ -33,6 +33,7 @@ void __sanitizer_syscall_pre_wait4(int pid, int *status, int options, void *r); 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(long res, int pid, int *status, 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_getres(long res, int clk_id, void *tp); #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_getres(long res, int clk_id, void *tp); #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, ...) diff --git a/compiler-rt/lib/msan/lit_tests/Linux/syscalls.cc b/compiler-rt/lib/msan/lit_tests/Linux/syscalls.cc index c716cfa..afab18d 100644 --- a/compiler-rt/lib/msan/lit_tests/Linux/syscalls.cc +++ b/compiler-rt/lib/msan/lit_tests/Linux/syscalls.cc @@ -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; } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc index 5a8b13f..5f4b24c 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc @@ -161,6 +161,15 @@ POST_SYSCALL(clock_getres)(long res, int clk_id, 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 -- 2.7.4