forked from OSchip/llvm-project
[sanitizer] Move stat/__xstat to the common interceptors
Summary: Adds stat/__xstat to the common interceptors. Removes the now-duplicate stat/__xstat interceptor from msan/tsan/esan. This adds stat/__xstat to asan, which previously did not intercept it. Resubmit of http://reviews.llvm.org/D19875 with win build fixes. Reviewers: aizatsky, eugenis Subscribers: tberghammer, llvm-commits, danalbert, vitalybuka, bruening, srhines, kubabrecka, kcc Differential Revision: http://reviews.llvm.org/D19890 llvm-svn: 268466
This commit is contained in:
parent
27370a09dd
commit
c826e634cc
|
@ -249,23 +249,6 @@ INTERCEPTOR(char *, strncpy, char *dst, char *src, uptr n) {
|
|||
return REAL(strncpy)(dst, src, n);
|
||||
}
|
||||
|
||||
#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_ANDROID
|
||||
INTERCEPTOR(int, stat, const char *path, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, stat, path, buf);
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);
|
||||
return REAL(stat)(path, buf);
|
||||
#define ESAN_INTERCEPT_STAT INTERCEPT_FUNCTION(stat)
|
||||
#else
|
||||
INTERCEPTOR(int, __xstat, int version, const char *path, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __xstat, version, path, buf);
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);
|
||||
return REAL(__xstat)(version, path, buf);
|
||||
}
|
||||
#define ESAN_INTERCEPT_STAT INTERCEPT_FUNCTION(__xstat)
|
||||
#endif
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, __xstat64, int version, const char *path, void *buf) {
|
||||
void *ctx;
|
||||
|
@ -413,7 +396,6 @@ void initializeInterceptors() {
|
|||
INTERCEPT_FUNCTION(strcpy); // NOLINT
|
||||
INTERCEPT_FUNCTION(strncpy);
|
||||
|
||||
ESAN_INTERCEPT_STAT;
|
||||
ESAN_MAYBE_INTERCEPT_STAT64;
|
||||
ESAN_MAYBE_INTERCEPT___XSTAT64;
|
||||
ESAN_INTERCEPT_LSTAT;
|
||||
|
|
|
@ -742,26 +742,6 @@ INTERCEPTOR(int, __fxstatat64, int magic, int fd, char *pathname, void *buf,
|
|||
#define MSAN_MAYBE_INTERCEPT___FXSTATAT64
|
||||
#endif
|
||||
|
||||
#if SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, stat, char *path, void *buf) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(stat)(path, buf);
|
||||
if (!res)
|
||||
__msan_unpoison(buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
# define MSAN_INTERCEPT_STAT INTERCEPT_FUNCTION(stat)
|
||||
#else
|
||||
INTERCEPTOR(int, __xstat, int magic, char *path, void *buf) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(__xstat)(magic, path, buf);
|
||||
if (!res)
|
||||
__msan_unpoison(buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
# define MSAN_INTERCEPT_STAT INTERCEPT_FUNCTION(__xstat)
|
||||
#endif
|
||||
|
||||
#if !SANITIZER_FREEBSD
|
||||
INTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) {
|
||||
ENSURE_MSAN_INITED();
|
||||
|
@ -1610,7 +1590,6 @@ void InitializeInterceptors() {
|
|||
INTERCEPT_FUNCTION(fcvt);
|
||||
MSAN_MAYBE_INTERCEPT___FXSTAT;
|
||||
MSAN_INTERCEPT_FSTATAT;
|
||||
MSAN_INTERCEPT_STAT;
|
||||
MSAN_MAYBE_INTERCEPT___LXSTAT;
|
||||
MSAN_MAYBE_INTERCEPT___FXSTAT64;
|
||||
MSAN_MAYBE_INTERCEPT___FXSTATAT64;
|
||||
|
|
|
@ -5529,6 +5529,40 @@ INTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags,
|
|||
#define INIT_RECV_RECVFROM
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_STAT
|
||||
INTERCEPTOR(int, stat, const char *path, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, stat, path, buf);
|
||||
if (common_flags()->intercept_stat)
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);
|
||||
int res = REAL(stat)(path, buf);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT_STAT COMMON_INTERCEPT_FUNCTION(stat)
|
||||
#else
|
||||
#define INIT_STAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT___XSTAT
|
||||
INTERCEPTOR(int, __xstat, int version, const char *path, void *buf) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, __xstat, version, path, buf);
|
||||
if (common_flags()->intercept_stat)
|
||||
COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);
|
||||
int res = REAL(__xstat)(version, path, buf);
|
||||
if (!res)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, __sanitizer::struct_stat_sz);
|
||||
return res;
|
||||
}
|
||||
#define INIT___XSTAT COMMON_INTERCEPT_FUNCTION(__xstat)
|
||||
#else
|
||||
#define INIT___XSTAT
|
||||
#endif
|
||||
|
||||
// FIXME: add other *stat interceptor
|
||||
|
||||
static void InitializeCommonInterceptors() {
|
||||
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
|
||||
interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();
|
||||
|
@ -5714,4 +5748,7 @@ static void InitializeCommonInterceptors() {
|
|||
INIT_CTERMID;
|
||||
INIT_CTERMID_R;
|
||||
INIT_RECV_RECVFROM;
|
||||
INIT_STAT;
|
||||
INIT___XSTAT;
|
||||
// FIXME: add other *stat interceptors.
|
||||
}
|
||||
|
|
|
@ -197,6 +197,9 @@ COMMON_FLAG(bool, strict_memcmp, true,
|
|||
COMMON_FLAG(bool, intercept_intrin, true,
|
||||
"If set, uses custom wrappers for memset/memcpy/memmove "
|
||||
"intrinsics to find more errors.")
|
||||
COMMON_FLAG(bool, intercept_stat, true,
|
||||
"If set, uses custom wrappers for *stat functions "
|
||||
"to find more errors.")
|
||||
COMMON_FLAG(bool, decorate_proc_maps, false, "If set, decorate sanitizer "
|
||||
"mappings in /proc/self/maps with "
|
||||
"user-readable names")
|
||||
|
|
|
@ -29,6 +29,12 @@
|
|||
# define SI_LINUX_NOT_ANDROID 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_ANDROID
|
||||
# define SI_ANDROID 1
|
||||
#else
|
||||
# define SI_ANDROID 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_FREEBSD
|
||||
# define SI_FREEBSD 1
|
||||
#else
|
||||
|
@ -291,4 +297,6 @@
|
|||
#define SANITIZER_INTERCEPTOR_HOOKS SI_LINUX
|
||||
#define SANITIZER_INTERCEPT_RECV_RECVFROM SI_NOT_WINDOWS
|
||||
|
||||
#define SANITIZER_INTERCEPT_STAT (SI_FREEBSD || SI_MAC || SI_ANDROID)
|
||||
#define SANITIZER_INTERCEPT___XSTAT !SANITIZER_INTERCEPT_STAT && SI_NOT_WINDOWS
|
||||
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
|
||||
|
|
|
@ -1349,29 +1349,6 @@ TSAN_INTERCEPTOR(int, pthread_once, void *o, void (*f)()) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
TSAN_INTERCEPTOR(int, __xstat, int version, const char *path, void *buf) {
|
||||
SCOPED_TSAN_INTERCEPTOR(__xstat, version, path, buf);
|
||||
READ_STRING(thr, pc, path, 0);
|
||||
return REAL(__xstat)(version, path, buf);
|
||||
}
|
||||
#define TSAN_MAYBE_INTERCEPT___XSTAT TSAN_INTERCEPT(__xstat)
|
||||
#else
|
||||
#define TSAN_MAYBE_INTERCEPT___XSTAT
|
||||
#endif
|
||||
|
||||
TSAN_INTERCEPTOR(int, stat, const char *path, void *buf) {
|
||||
#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_ANDROID
|
||||
SCOPED_TSAN_INTERCEPTOR(stat, path, buf);
|
||||
READ_STRING(thr, pc, path, 0);
|
||||
return REAL(stat)(path, buf);
|
||||
#else
|
||||
SCOPED_TSAN_INTERCEPTOR(__xstat, 0, path, buf);
|
||||
READ_STRING(thr, pc, path, 0);
|
||||
return REAL(__xstat)(0, path, buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
TSAN_INTERCEPTOR(int, __xstat64, int version, const char *path, void *buf) {
|
||||
SCOPED_TSAN_INTERCEPTOR(__xstat64, version, path, buf);
|
||||
|
@ -2617,8 +2594,6 @@ void InitializeInterceptors() {
|
|||
|
||||
TSAN_INTERCEPT(pthread_once);
|
||||
|
||||
TSAN_INTERCEPT(stat);
|
||||
TSAN_MAYBE_INTERCEPT___XSTAT;
|
||||
TSAN_MAYBE_INTERCEPT_STAT64;
|
||||
TSAN_MAYBE_INTERCEPT___XSTAT64;
|
||||
TSAN_INTERCEPT(lstat);
|
||||
|
|
Loading…
Reference in New Issue