From aff25aa02098a510eff6eda1a3ec823e5b1fe1aa Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 25 Oct 2013 08:58:13 +0000 Subject: [sanitizer] Intercept random_r. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@193396 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/msan/tests/msan_test.cc | 13 +++++++++++++ lib/sanitizer_common/sanitizer_common_interceptors.inc | 15 +++++++++++++++ lib/sanitizer_common/sanitizer_platform_interceptors.h | 1 + lib/tsan/rtl/tsan_stat.cc | 1 + lib/tsan/rtl/tsan_stat.h | 1 + 5 files changed, 31 insertions(+) diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index a8efd3cc..9f6d7d50 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -1146,6 +1146,19 @@ TEST(MemorySanitizer, shmctl) { ASSERT_GT(res, -1); } +TEST(MemorySanitizer, random_r) { + int32_t x; + char z[64]; + struct random_data buf; + + memset(z, 0, sizeof(z)); + int res = initstate_r(0, z, sizeof(z), &buf); + ASSERT_EQ(0, res); + + res = random_r(&buf, &x); + ASSERT_EQ(0, res); + EXPECT_NOT_POISONED(x); +} TEST(MemorySanitizer, confstr) { char buf[3]; diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 4beedd21..e69a21d0 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -2526,6 +2526,20 @@ INTERCEPTOR(int, shmctl, int shmid, int cmd, void *buf) { #define INIT_SHMCTL #endif +#if SANITIZER_INTERCEPT_RANDOM_R +INTERCEPTOR(int, random_r, void *buf, u32 *result) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, random_r, buf, result); + int res = REAL(random_r)(buf, result); + if (!res && result) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result)); + return res; +} +#define INIT_RANDOM_R INTERCEPT_FUNCTION(random_r); +#else +#define INIT_RANDOM_R +#endif + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCMP; \ INIT_STRNCMP; \ @@ -2620,4 +2634,5 @@ INTERCEPTOR(int, shmctl, int shmid, int cmd, void *buf) { INIT_ETHER; \ INIT_ETHER_R; \ INIT_SHMCTL; \ + INIT_RANDOM_R; \ /**/ diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 401c7d3a..8610f1b8 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -136,6 +136,7 @@ # define SANITIZER_INTERCEPT_ETHER SI_NOT_WINDOWS # define SANITIZER_INTERCEPT_ETHER_R SI_LINUX_NOT_ANDROID # define SANITIZER_INTERCEPT_SHMCTL SI_LINUX_NOT_ANDROID +# define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID # define SANITIZER_INTERCEPT__EXIT SI_LINUX diff --git a/lib/tsan/rtl/tsan_stat.cc b/lib/tsan/rtl/tsan_stat.cc index 30177e71..64c2bd01 100644 --- a/lib/tsan/rtl/tsan_stat.cc +++ b/lib/tsan/rtl/tsan_stat.cc @@ -393,6 +393,7 @@ void StatOutput(u64 *stat) { name[StatInt_ether_hostton] = " ether_hostton "; name[StatInt_ether_line] = " ether_line "; name[StatInt_shmctl] = " shmctl "; + name[StatInt_random_r] = " random_r "; name[StatAnnotation] = "Dynamic annotations "; name[StatAnnotateHappensBefore] = " HappensBefore "; diff --git a/lib/tsan/rtl/tsan_stat.h b/lib/tsan/rtl/tsan_stat.h index 5b8c60f0..bf7d6c8a 100644 --- a/lib/tsan/rtl/tsan_stat.h +++ b/lib/tsan/rtl/tsan_stat.h @@ -388,6 +388,7 @@ enum StatType { StatInt_ether_hostton, StatInt_ether_line, StatInt_shmctl, + StatInt_random_r, // Dynamic annotations. StatAnnotation, -- cgit v1.2.3