[sanitizer] Syscall handlers for clock_gettime and clock_getres.
llvm-svn: 185913
This commit is contained in:
parent
414d4e58aa
commit
f7f252d025
|
@ -31,6 +31,8 @@ void __sanitizer_syscall_pre_getdents64(int fd, void *dirp, int count);
|
|||
void __sanitizer_syscall_pre_recvmsg(int sockfd, void *msg, int flags);
|
||||
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_post_rt_sigpending(long res, void *p, size_t s);
|
||||
void __sanitizer_syscall_post_getdents(long res, int fd, void *dirp, int count);
|
||||
|
@ -42,6 +44,8 @@ void __sanitizer_syscall_post_wait4(long res, int pid, int *status, int options,
|
|||
void *r);
|
||||
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);
|
||||
|
||||
// And now a few syscalls we don't handle yet.
|
||||
|
||||
|
@ -66,8 +70,6 @@ void __sanitizer_syscall_post_waitpid(long res, int pid, int *status,
|
|||
#define __sanitizer_syscall_pre_chown32(...)
|
||||
#define __sanitizer_syscall_pre_chroot(...)
|
||||
#define __sanitizer_syscall_pre_clock_adjtime(...)
|
||||
#define __sanitizer_syscall_pre_clock_getres(...)
|
||||
#define __sanitizer_syscall_pre_clock_gettime(...)
|
||||
#define __sanitizer_syscall_pre_clock_nanosleep(...)
|
||||
#define __sanitizer_syscall_pre_clock_settime(...)
|
||||
#define __sanitizer_syscall_pre_clone(...)
|
||||
|
@ -441,8 +443,6 @@ void __sanitizer_syscall_post_waitpid(long res, int pid, int *status,
|
|||
#define __sanitizer_syscall_post_chown(res, ...)
|
||||
#define __sanitizer_syscall_post_chroot(res, ...)
|
||||
#define __sanitizer_syscall_post_clock_adjtime(res, ...)
|
||||
#define __sanitizer_syscall_post_clock_getres(res, ...)
|
||||
#define __sanitizer_syscall_post_clock_gettime(res, ...)
|
||||
#define __sanitizer_syscall_post_clock_nanosleep(res, ...)
|
||||
#define __sanitizer_syscall_post_clock_settime(res, ...)
|
||||
#define __sanitizer_syscall_post_clone(res, ...)
|
||||
|
|
|
@ -46,5 +46,18 @@ int main(int argc, char *argv[]) {
|
|||
__msan_poison(buf, kTen + 1);
|
||||
__sanitizer_syscall_post_getdents64(kTen, 0, buf, kTen);
|
||||
assert(__msan_test_shadow(buf, sizeof(buf)) == kTen);
|
||||
|
||||
__msan_poison(buf, sizeof(buf));
|
||||
__sanitizer_syscall_post_clock_getres(0, 0, buf);
|
||||
assert(__msan_test_shadow(buf, sizeof(buf)) == sizeof(long) * 2);
|
||||
|
||||
__msan_poison(buf, sizeof(buf));
|
||||
__sanitizer_syscall_post_clock_gettime(0, 0, buf);
|
||||
assert(__msan_test_shadow(buf, sizeof(buf)) == sizeof(long) * 2);
|
||||
|
||||
// Failed syscall does not write to the buffer.
|
||||
__msan_poison(buf, sizeof(buf));
|
||||
__sanitizer_syscall_post_clock_gettime(-1, 0, buf);
|
||||
assert(__msan_test_shadow(buf, sizeof(buf)) == 0);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -55,6 +55,11 @@ struct sanitizer_kernel_msghdr {
|
|||
unsigned msg_flags;
|
||||
};
|
||||
|
||||
struct sanitizer_kernel_timespec {
|
||||
long tv_sec;
|
||||
long tv_nsec;
|
||||
};
|
||||
|
||||
struct sanitizer_kernel_timeval {
|
||||
long tv_sec;
|
||||
long tv_usec;
|
||||
|
@ -138,6 +143,23 @@ POST_SYSCALL(waitpid)(long res, int pid, int *status, int options) {
|
|||
POST_WRITE(status, sizeof(*status));
|
||||
}
|
||||
}
|
||||
|
||||
PRE_SYSCALL(clock_gettime)(int clk_id, struct sanitizer_kernel_timespec *tp) {
|
||||
if (tp) PRE_WRITE(tp, sizeof(*tp));
|
||||
}
|
||||
|
||||
POST_SYSCALL(clock_gettime)(long res, int clk_id, struct sanitizer_kernel_timespec *tp) {
|
||||
if (res == 0 && tp) POST_WRITE(tp, sizeof(*tp));
|
||||
}
|
||||
|
||||
PRE_SYSCALL(clock_getres)(int clk_id, struct sanitizer_kernel_timespec *tp) {
|
||||
if (tp) PRE_WRITE(tp, sizeof(*tp));
|
||||
}
|
||||
|
||||
POST_SYSCALL(clock_getres)(long res, int clk_id, struct sanitizer_kernel_timespec *tp) {
|
||||
if (res == 0 && tp) POST_WRITE(tp, sizeof(*tp));
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
#undef PRE_SYSCALL
|
||||
|
|
Loading…
Reference in New Issue