forked from OSchip/llvm-project
[sanitizer] Move *fstat to the common interceptors
Summary: Adds *fstat to the common interceptors. Removes the now-duplicate fstat interceptor from msan/tsan This adds fstat to asan/esan, which previously did not intercept it. Reviewers: eugenis, vitalybuka, aizatsky Subscribers: tberghammer, danalbert, srhines, kubabrecka, bruening, kcc Differential Revision: http://reviews.llvm.org/D20318 llvm-svn: 269856
This commit is contained in:
parent
7d47c990e6
commit
924acb50c9
|
@ -168,6 +168,9 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
|||
#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) \
|
||||
do { \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd) \
|
||||
do { \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, newfd) \
|
||||
do { \
|
||||
} while (false)
|
||||
|
|
|
@ -684,64 +684,6 @@ INTERCEPTOR(int, putenv, char *string) {
|
|||
return res;
|
||||
}
|
||||
|
||||
#if !SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(__fxstat)(magic, fd, buf);
|
||||
if (!res)
|
||||
__msan_unpoison(buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTAT INTERCEPT_FUNCTION(__fxstat)
|
||||
#else
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTAT
|
||||
#endif
|
||||
|
||||
#if !SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(__fxstat64)(magic, fd, buf);
|
||||
if (!res)
|
||||
__msan_unpoison(buf, __sanitizer::struct_stat64_sz);
|
||||
return res;
|
||||
}
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTAT64 INTERCEPT_FUNCTION(__fxstat64)
|
||||
#else
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTAT64
|
||||
#endif
|
||||
|
||||
#if SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, fstatat, int fd, char *pathname, void *buf, int flags) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(fstatat)(fd, pathname, buf, flags);
|
||||
if (!res) __msan_unpoison(buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
# define MSAN_INTERCEPT_FSTATAT INTERCEPT_FUNCTION(fstatat)
|
||||
#else
|
||||
INTERCEPTOR(int, __fxstatat, int magic, int fd, char *pathname, void *buf,
|
||||
int flags) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(__fxstatat)(magic, fd, pathname, buf, flags);
|
||||
if (!res) __msan_unpoison(buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
# define MSAN_INTERCEPT_FSTATAT INTERCEPT_FUNCTION(__fxstatat)
|
||||
#endif
|
||||
|
||||
#if !SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, __fxstatat64, int magic, int fd, char *pathname, void *buf,
|
||||
int flags) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(__fxstatat64)(magic, fd, pathname, buf, flags);
|
||||
if (!res) __msan_unpoison(buf, __sanitizer::struct_stat64_sz);
|
||||
return res;
|
||||
}
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTATAT64 INTERCEPT_FUNCTION(__fxstatat64)
|
||||
#else
|
||||
#define MSAN_MAYBE_INTERCEPT___FXSTATAT64
|
||||
#endif
|
||||
|
||||
INTERCEPTOR(int, pipe, int pipefd[2]) {
|
||||
if (msan_init_is_running)
|
||||
return REAL(pipe)(pipefd);
|
||||
|
@ -1303,6 +1245,9 @@ int OnExit() {
|
|||
#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) \
|
||||
do { \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd) \
|
||||
do { \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, newfd) \
|
||||
do { \
|
||||
} while (false)
|
||||
|
@ -1549,10 +1494,6 @@ void InitializeInterceptors() {
|
|||
INTERCEPT_FUNCTION(putenv);
|
||||
INTERCEPT_FUNCTION(gettimeofday);
|
||||
INTERCEPT_FUNCTION(fcvt);
|
||||
MSAN_MAYBE_INTERCEPT___FXSTAT;
|
||||
MSAN_INTERCEPT_FSTATAT;
|
||||
MSAN_MAYBE_INTERCEPT___FXSTAT64;
|
||||
MSAN_MAYBE_INTERCEPT___FXSTATAT64;
|
||||
INTERCEPT_FUNCTION(pipe);
|
||||
INTERCEPT_FUNCTION(pipe2);
|
||||
INTERCEPT_FUNCTION(socketpair);
|
||||
|
|
|
@ -5609,7 +5609,106 @@ INTERCEPTOR(int, __lxstat64, int version, const char *path, void *buf) {
|
|||
#define INIT___LXSTAT64
|
||||
#endif
|
||||
|
||||
// FIXME: add other *stat interceptor
|
||||
#if SANITIZER_INTERCEPT_FSTAT
|
||||
INTERCEPTOR(int, fstat, int fd, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, fstat, fd, buf);
|
||||
if (common_flags()->intercept_stat && fd > 0)
|
||||
COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
|
||||
int res = REAL(fstat)(fd, buf);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT_FSTAT COMMON_INTERCEPT_FUNCTION(fstat)
|
||||
#else
|
||||
#define INIT_FSTAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT___FXSTAT
|
||||
INTERCEPTOR(int, __fxstat, int version, int fd, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __fxstat, version, fd, buf);
|
||||
if (common_flags()->intercept_stat && fd > 0)
|
||||
COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
|
||||
int res = REAL(__fxstat)(version, fd, buf);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT___FXSTAT COMMON_INTERCEPT_FUNCTION(__fxstat)
|
||||
#else
|
||||
#define INIT___FXSTAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT___FXSTAT64
|
||||
INTERCEPTOR(int, __fxstat64, int version, int fd, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __fxstat64, version, fd, buf);
|
||||
if (common_flags()->intercept_stat && fd > 0)
|
||||
COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
|
||||
int res = REAL(__fxstat64)(version, fd, buf);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat64_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT___FXSTAT64 COMMON_INTERCEPT_FUNCTION(__fxstat64)
|
||||
#else
|
||||
#define INIT___FXSTAT64
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_FSTATAT
|
||||
INTERCEPTOR(int, fstatat, int fd, char *pathname, void *buf, int flags) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, fstatat, fd, pathname, buf, flags);
|
||||
if (common_flags()->intercept_stat)
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, pathname, 0);
|
||||
int res = REAL(fstatat)(fd, pathname, buf, flags);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT_FSTATAT COMMON_INTERCEPT_FUNCTION(fstatat);
|
||||
#else
|
||||
#define INIT_FSTATAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT___FXSTATAT
|
||||
INTERCEPTOR(int, __fxstatat, int version, int fd, char *pathname, void *buf,
|
||||
int flags) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __fxstatat, version, fd, pathname, buf, flags);
|
||||
if (common_flags()->intercept_stat)
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, pathname, 0);
|
||||
int res = REAL(__fxstatat)(fd, version, pathname, buf, flags);
|
||||
if (!res) {
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
#define INIT___FXSTATAT COMMON_INTERCEPT_FUNCTION(__fxstatat);
|
||||
#else
|
||||
#define INIT___FXSTATAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT___FXSTATAT64
|
||||
INTERCEPTOR(int, __fxstatat64, int version, int fd, char *pathname, void *buf,
|
||||
int flags) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __fxstatat64, version, fd, pathname, buf,
|
||||
flags);
|
||||
if (common_flags()->intercept_stat)
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, pathname, 0);
|
||||
int res = REAL(__fxstatat64)(fd, version, pathname, buf, flags);
|
||||
if (!res) {
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat64_sz);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
#define INIT___FXSTATAT64 COMMON_INTERCEPT_FUNCTION(__fxstatat64);
|
||||
#else
|
||||
#define INIT___FXSTATAT64
|
||||
#endif
|
||||
|
||||
static void InitializeCommonInterceptors() {
|
||||
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
|
||||
|
@ -5801,5 +5900,10 @@ static void InitializeCommonInterceptors() {
|
|||
INIT___XSTAT64;
|
||||
INIT___LXSTAT;
|
||||
INIT___LXSTAT64;
|
||||
// FIXME: add other *stat interceptors.
|
||||
INIT_FSTAT;
|
||||
INIT___FXSTAT;
|
||||
INIT___FXSTAT64;
|
||||
INIT_FSTATAT;
|
||||
INIT___FXSTATAT;
|
||||
INIT___FXSTATAT64;
|
||||
}
|
||||
|
|
|
@ -302,4 +302,10 @@
|
|||
#define SANITIZER_INTERCEPT___XSTAT64 SI_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT___LXSTAT SANITIZER_INTERCEPT___XSTAT
|
||||
#define SANITIZER_INTERCEPT___LXSTAT64 SI_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT_FSTAT SANITIZER_INTERCEPT_STAT
|
||||
#define SANITIZER_INTERCEPT___FXSTAT SANITIZER_INTERCEPT___XSTAT
|
||||
#define SANITIZER_INTERCEPT___FXSTAT64 SI_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT_FSTATAT SI_FREEBSD
|
||||
#define SANITIZER_INTERCEPT___FXSTATAT !SI_FREEBSD && SI_NOT_WINDOWS
|
||||
#define SANITIZER_INTERCEPT___FXSTATAT64 !SI_FREEBSD && SI_NOT_WINDOWS
|
||||
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
|
||||
|
|
|
@ -1358,56 +1358,6 @@ TSAN_INTERCEPTOR(int, pthread_once, void *o, void (*f)()) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
TSAN_INTERCEPTOR(int, __fxstat, int version, int fd, void *buf) {
|
||||
SCOPED_TSAN_INTERCEPTOR(__fxstat, version, fd, buf);
|
||||
if (fd > 0)
|
||||
FdAccess(thr, pc, fd);
|
||||
return REAL(__fxstat)(version, fd, buf);
|
||||
}
|
||||
#define TSAN_MAYBE_INTERCEPT___FXSTAT TSAN_INTERCEPT(__fxstat)
|
||||
#else
|
||||
#define TSAN_MAYBE_INTERCEPT___FXSTAT
|
||||
#endif
|
||||
|
||||
TSAN_INTERCEPTOR(int, fstat, int fd, void *buf) {
|
||||
#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_ANDROID
|
||||
SCOPED_TSAN_INTERCEPTOR(fstat, fd, buf);
|
||||
if (fd > 0)
|
||||
FdAccess(thr, pc, fd);
|
||||
return REAL(fstat)(fd, buf);
|
||||
#else
|
||||
SCOPED_TSAN_INTERCEPTOR(__fxstat, 0, fd, buf);
|
||||
if (fd > 0)
|
||||
FdAccess(thr, pc, fd);
|
||||
return REAL(__fxstat)(0, fd, buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
TSAN_INTERCEPTOR(int, __fxstat64, int version, int fd, void *buf) {
|
||||
SCOPED_TSAN_INTERCEPTOR(__fxstat64, version, fd, buf);
|
||||
if (fd > 0)
|
||||
FdAccess(thr, pc, fd);
|
||||
return REAL(__fxstat64)(version, fd, buf);
|
||||
}
|
||||
#define TSAN_MAYBE_INTERCEPT___FXSTAT64 TSAN_INTERCEPT(__fxstat64)
|
||||
#else
|
||||
#define TSAN_MAYBE_INTERCEPT___FXSTAT64
|
||||
#endif
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
TSAN_INTERCEPTOR(int, fstat64, int fd, void *buf) {
|
||||
SCOPED_TSAN_INTERCEPTOR(__fxstat64, 0, fd, buf);
|
||||
if (fd > 0)
|
||||
FdAccess(thr, pc, fd);
|
||||
return REAL(__fxstat64)(0, fd, buf);
|
||||
}
|
||||
#define TSAN_MAYBE_INTERCEPT_FSTAT64 TSAN_INTERCEPT(fstat64)
|
||||
#else
|
||||
#define TSAN_MAYBE_INTERCEPT_FSTAT64
|
||||
#endif
|
||||
|
||||
TSAN_INTERCEPTOR(int, open, const char *name, int flags, int mode) {
|
||||
SCOPED_TSAN_INTERCEPTOR(open, name, flags, mode);
|
||||
READ_STRING(thr, pc, name, 0);
|
||||
|
@ -2536,10 +2486,6 @@ void InitializeInterceptors() {
|
|||
|
||||
TSAN_INTERCEPT(pthread_once);
|
||||
|
||||
TSAN_INTERCEPT(fstat);
|
||||
TSAN_MAYBE_INTERCEPT___FXSTAT;
|
||||
TSAN_MAYBE_INTERCEPT_FSTAT64;
|
||||
TSAN_MAYBE_INTERCEPT___FXSTAT64;
|
||||
TSAN_INTERCEPT(open);
|
||||
TSAN_MAYBE_INTERCEPT_OPEN64;
|
||||
TSAN_INTERCEPT(creat);
|
||||
|
|
Loading…
Reference in New Issue