From eada1a81188329b3f011311caed12ca4be4f639e Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 25 Oct 2013 15:51:48 +0000 Subject: [sanitizer] Intercept tmpnam, tmpnam_r, tempnam. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@193415 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/msan/tests/msan_test.cc | 13 ++++++ .../sanitizer_common_interceptors.inc | 50 ++++++++++++++++++++++ .../sanitizer_platform_interceptors.h | 3 ++ lib/tsan/rtl/tsan_stat.cc | 3 ++ lib/tsan/rtl/tsan_stat.h | 4 ++ 5 files changed, 73 insertions(+) diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index 37f2db80..e6923828 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -2635,6 +2635,19 @@ TEST(MemorySanitizer, pthread_cond_wait) { pthread_cond_destroy(&cond); } +TEST(MemorySanitizer, tmpnam) { + char s[L_tmpnam]; + char *res = tmpnam(s); + ASSERT_EQ(s, res); + EXPECT_NOT_POISONED(strlen(res)); +} + +TEST(MemorySanitizer, tempnam) { + char *res = tempnam(NULL, "zzz"); + EXPECT_NOT_POISONED(strlen(res)); + free(res); +} + TEST(MemorySanitizer, posix_memalign) { void *p; EXPECT_POISONED(p); diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index e521fb59..e13df5c2 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -2609,6 +2609,53 @@ INTERCEPTOR(int, pthread_attr_getaffinity_np, void *attr, SIZE_T cpusetsize, #define INIT_PTHREAD_ATTR_GETAFFINITY_NP #endif +#if SANITIZER_INTERCEPT_TMPNAM +INTERCEPTOR(char *, tmpnam, char *s) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, tmpnam, s); + char *res = REAL(tmpnam)(s); + if (res) { + if (s) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, s, REAL(strlen)(s) + 1); + else + COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1); + } + return res; +} +#define INIT_TMPNAM INTERCEPT_FUNCTION(tmpnam); +#else +#define INIT_TMPNAM +#endif + +#if SANITIZER_INTERCEPT_TMPNAM_R +INTERCEPTOR(char *, tmpnam_r, char *s) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, tmpnam_r, s); + char *res = REAL(tmpnam_r)(s); + if (res && s) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, s, REAL(strlen)(s) + 1); + return res; +} +#define INIT_TMPNAM_R INTERCEPT_FUNCTION(tmpnam_r); +#else +#define INIT_TMPNAM_R +#endif + +#if SANITIZER_INTERCEPT_TEMPNAM +INTERCEPTOR(char *, tempnam, char *dir, char *pfx) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, tempnam, dir, pfx); + if (dir) COMMON_INTERCEPTOR_READ_RANGE(ctx, dir, REAL(strlen)(dir) + 1); + if (pfx) COMMON_INTERCEPTOR_READ_RANGE(ctx, pfx, REAL(strlen)(pfx) + 1); + char *res = REAL(tempnam)(dir, pfx); + if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(ctx, res, REAL(strlen)(res) + 1); + return res; +} +#define INIT_TEMPNAM INTERCEPT_FUNCTION(tempnam); +#else +#define INIT_TEMPNAM +#endif + + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCMP; \ INIT_STRNCMP; \ @@ -2707,4 +2754,7 @@ INTERCEPTOR(int, pthread_attr_getaffinity_np, void *attr, SIZE_T cpusetsize, INIT_PTHREAD_ATTR_GET; \ INIT_PTHREAD_ATTR_GETINHERITSCHED; \ INIT_PTHREAD_ATTR_GETAFFINITY_NP; \ + INIT_TMPNAM; \ + INIT_TMPNAM_R; \ + INIT_TEMPNAM; \ /**/ diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 048b9076..58cd0f95 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -141,6 +141,9 @@ # define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \ SI_MAC || SI_LINUX_NOT_ANDROID # define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETAFFINITY_NP SI_LINUX_NOT_ANDROID +# define SANITIZER_INTERCEPT_TMPNAM SI_NOT_WINDOWS +# define SANITIZER_INTERCEPT_TMPNAM_R SI_MAC || SI_LINUX_NOT_ANDROID +# define SANITIZER_INTERCEPT_TEMPNAM SI_NOT_WINDOWS # define SANITIZER_INTERCEPT__EXIT SI_LINUX diff --git a/lib/tsan/rtl/tsan_stat.cc b/lib/tsan/rtl/tsan_stat.cc index b7c56604..eb34be2e 100644 --- a/lib/tsan/rtl/tsan_stat.cc +++ b/lib/tsan/rtl/tsan_stat.cc @@ -394,6 +394,9 @@ void StatOutput(u64 *stat) { name[StatInt_ether_line] = " ether_line "; name[StatInt_shmctl] = " shmctl "; name[StatInt_random_r] = " random_r "; + name[StatInt_tmpnam] = " tmpnam "; + name[StatInt_tmpnam_r] = " tmpnam_r "; + name[StatInt_tempnam] = " tempnam "; name[StatInt_pthread_attr_getdetachstate] = " pthread_addr_getdetachstate "; // NOLINT name[StatInt_pthread_attr_getguardsize] = " pthread_addr_getguardsize "; // NOLINT diff --git a/lib/tsan/rtl/tsan_stat.h b/lib/tsan/rtl/tsan_stat.h index 6b2166ab..cad6b870 100644 --- a/lib/tsan/rtl/tsan_stat.h +++ b/lib/tsan/rtl/tsan_stat.h @@ -389,6 +389,10 @@ enum StatType { StatInt_ether_line, StatInt_shmctl, StatInt_random_r, + StatInt_tmpnam, + StatInt_tmpnam_r, + StatInt_tempnam, + StatInt_pthread_attr_getdetachstate, StatInt_pthread_attr_getguardsize, StatInt_pthread_attr_getschedparam, -- cgit v1.2.3