summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Aizatsky <aizatsky@chromium.org>2016-05-03 21:49:56 +0000
committerMike Aizatsky <aizatsky@chromium.org>2016-05-03 21:49:56 +0000
commit71107c138e2ac4a0365d1b48871488b8d941fb3a (patch)
tree2215369bb14f6832b24cc6b642d8f01ceeffe8f9 /lib
parente32b2d7aa482778cf6656a3090025b8c6ea1668f (diff)
Revert "[sanitizer] Move stat/__xstat to the common interceptors"
This reverts commit 268440 because it breaks the windows bot. http://lab.llvm.org:8011/builders/sanitizer-windows/builds/21425/steps/build%20compiler-rt/logs/stdio git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@268448 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/esan/esan_interceptors.cpp18
-rw-r--r--lib/msan/msan_interceptors.cc21
-rw-r--r--lib/sanitizer_common/sanitizer_common_interceptors.inc37
-rw-r--r--lib/sanitizer_common/sanitizer_flags.inc3
-rw-r--r--lib/sanitizer_common/sanitizer_platform_interceptors.h8
-rw-r--r--lib/tsan/rtl/tsan_interceptors.cc25
6 files changed, 64 insertions, 48 deletions
diff --git a/lib/esan/esan_interceptors.cpp b/lib/esan/esan_interceptors.cpp
index be40032f5..479fde994 100644
--- a/lib/esan/esan_interceptors.cpp
+++ b/lib/esan/esan_interceptors.cpp
@@ -249,6 +249,23 @@ 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;
@@ -396,6 +413,7 @@ void initializeInterceptors() {
INTERCEPT_FUNCTION(strcpy); // NOLINT
INTERCEPT_FUNCTION(strncpy);
+ ESAN_INTERCEPT_STAT;
ESAN_MAYBE_INTERCEPT_STAT64;
ESAN_MAYBE_INTERCEPT___XSTAT64;
ESAN_INTERCEPT_LSTAT;
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc
index d4ec590c5..e51fd17de 100644
--- a/lib/msan/msan_interceptors.cc
+++ b/lib/msan/msan_interceptors.cc
@@ -742,6 +742,26 @@ 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();
@@ -1590,6 +1610,7 @@ 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;
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 142424914..e2ef649a8 100644
--- a/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -5529,40 +5529,6 @@ 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();
@@ -5748,7 +5714,4 @@ static void InitializeCommonInterceptors() {
INIT_CTERMID;
INIT_CTERMID_R;
INIT_RECV_RECVFROM;
- INIT_STAT;
- INIT___XSTAT;
- // FIXME: add other *stat interceptors.
}
diff --git a/lib/sanitizer_common/sanitizer_flags.inc b/lib/sanitizer_common/sanitizer_flags.inc
index 858a881d0..d2fbc8b6f 100644
--- a/lib/sanitizer_common/sanitizer_flags.inc
+++ b/lib/sanitizer_common/sanitizer_flags.inc
@@ -197,9 +197,6 @@ 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")
diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h
index 30882ad44..4c30923cc 100644
--- a/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -29,12 +29,6 @@
# 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
@@ -297,6 +291,4 @@
#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
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc
index f662c4477..03657fe1c 100644
--- a/lib/tsan/rtl/tsan_interceptors.cc
+++ b/lib/tsan/rtl/tsan_interceptors.cc
@@ -1350,6 +1350,29 @@ TSAN_INTERCEPTOR(int, pthread_once, void *o, void (*f)()) {
}
#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);
READ_STRING(thr, pc, path, 0);
@@ -2594,6 +2617,8 @@ void InitializeInterceptors() {
TSAN_INTERCEPT(pthread_once);
+ TSAN_INTERCEPT(stat);
+ TSAN_MAYBE_INTERCEPT___XSTAT;
TSAN_MAYBE_INTERCEPT_STAT64;
TSAN_MAYBE_INTERCEPT___XSTAT64;
TSAN_INTERCEPT(lstat);