diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-10-24 14:47:34 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-10-24 14:47:34 +0000 |
commit | 10362d66fffcd99bd5ced983e4b389dfeba114d0 (patch) | |
tree | ae8c70de46a077ca5cd55908fe483219c13251d5 /lib | |
parent | 1161eb4bff61908074699f6459eabce25839f966 (diff) | |
download | compiler-rt-10362d66fffcd99bd5ced983e4b389dfeba114d0.tar.gz compiler-rt-10362d66fffcd99bd5ced983e4b389dfeba114d0.tar.bz2 compiler-rt-10362d66fffcd99bd5ced983e4b389dfeba114d0.tar.xz |
[sanitizer] Intercept shmctl.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@193348 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msan/tests/msan_test.cc | 26 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 23 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_interceptors.h | 1 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.cc | 12 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.h | 9 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_stat.cc | 1 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_stat.h | 1 |
7 files changed, 73 insertions, 0 deletions
diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index f185a31d..a8efd3cc 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -53,6 +53,8 @@ #include <wordexp.h> #include <mntent.h> #include <netinet/ether.h> +#include <sys/ipc.h> +#include <sys/shm.h> #if defined(__i386__) || defined(__x86_64__) # include <emmintrin.h> @@ -1121,6 +1123,30 @@ TEST(MemorySanitizer, get_current_dir_name) { free(res); } +TEST(MemorySanitizer, shmctl) { + int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT); + ASSERT_GT(id, -1); + + struct shmid_ds ds; + int res = shmctl(id, IPC_STAT, &ds); + ASSERT_GT(res, -1); + EXPECT_NOT_POISONED(ds); + + struct shminfo si; + res = shmctl(id, IPC_INFO, (struct shmid_ds *)&si); + ASSERT_GT(res, -1); + EXPECT_NOT_POISONED(si); + + struct shm_info s_i; + res = shmctl(id, SHM_INFO, (struct shmid_ds *)&s_i); + ASSERT_GT(res, -1); + EXPECT_NOT_POISONED(s_i); + + res = shmctl(id, IPC_RMID, 0); + ASSERT_GT(res, -1); +} + + TEST(MemorySanitizer, confstr) { char buf[3]; size_t res = confstr(_CS_PATH, buf, sizeof(buf)); diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 9cef9380..4beedd21 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -2504,6 +2504,28 @@ INTERCEPTOR(__sanitizer_ether_addr *, ether_aton_r, char *buf, #define INIT_ETHER_R #endif +#if SANITIZER_INTERCEPT_SHMCTL +INTERCEPTOR(int, shmctl, int shmid, int cmd, void *buf) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, shmctl, shmid, cmd, buf); + int res = REAL(shmctl)(shmid, cmd, buf); + if (res >= 0) { + unsigned sz = 0; + if (cmd == shmctl_ipc_stat || cmd == shmctl_shm_stat) + sz = struct_shmid_ds_sz; + else if (cmd == shmctl_ipc_info) + sz = struct_shminfo_sz; + else if (cmd == shmctl_shm_info) + sz = struct_shm_info_sz; + if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, sz); + } + return res; +} +#define INIT_SHMCTL INTERCEPT_FUNCTION(shmctl); +#else +#define INIT_SHMCTL +#endif + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCMP; \ INIT_STRNCMP; \ @@ -2597,4 +2619,5 @@ INTERCEPTOR(__sanitizer_ether_addr *, ether_aton_r, char *buf, INIT_INITGROUPS; \ INIT_ETHER; \ INIT_ETHER_R; \ + INIT_SHMCTL; \ /**/ diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index a20b9268..401c7d3a 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -135,6 +135,7 @@ # define SANITIZER_INTERCEPT_INITGROUPS SI_NOT_WINDOWS # 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__EXIT SI_LINUX diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc index 4cdf3694..7aca7f7e 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc @@ -92,6 +92,8 @@ #include <linux/scc.h> #include <linux/serial.h> #include <sys/msg.h> +#include <sys/ipc.h> +#include <sys/shm.h> #endif // SANITIZER_LINUX && !SANITIZER_ANDROID #if SANITIZER_ANDROID @@ -180,6 +182,16 @@ namespace __sanitizer { int e_tabsz = (int)E_TABSZ; #endif + +#if SANITIZER_LINUX && !SANITIZER_ANDROID + unsigned struct_shminfo_sz = sizeof(struct shminfo); + unsigned struct_shm_info_sz = sizeof(struct shm_info); + int shmctl_ipc_stat = (int)IPC_STAT; + int shmctl_ipc_info = (int)IPC_INFO; + int shmctl_shm_info = (int)SHM_INFO; + int shmctl_shm_stat = (int)SHM_INFO; +#endif + int af_inet = (int)AF_INET; int af_inet6 = (int)AF_INET6; diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h index 3cbd0f64..ae99403d 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -356,6 +356,15 @@ namespace __sanitizer { extern int ptrace_setregset; #endif +#if SANITIZER_LINUX && !SANITIZER_ANDROID + extern unsigned struct_shminfo_sz; + extern unsigned struct_shm_info_sz; + extern int shmctl_ipc_stat; + extern int shmctl_ipc_info; + extern int shmctl_shm_info; + extern int shmctl_shm_stat; +#endif + // ioctl arguments struct __sanitizer_ifconf { int ifc_len; diff --git a/lib/tsan/rtl/tsan_stat.cc b/lib/tsan/rtl/tsan_stat.cc index 73622986..30177e71 100644 --- a/lib/tsan/rtl/tsan_stat.cc +++ b/lib/tsan/rtl/tsan_stat.cc @@ -392,6 +392,7 @@ void StatOutput(u64 *stat) { name[StatInt_ether_ntohost] = " ether_ntohost "; name[StatInt_ether_hostton] = " ether_hostton "; name[StatInt_ether_line] = " ether_line "; + name[StatInt_shmctl] = " shmctl "; name[StatAnnotation] = "Dynamic annotations "; name[StatAnnotateHappensBefore] = " HappensBefore "; diff --git a/lib/tsan/rtl/tsan_stat.h b/lib/tsan/rtl/tsan_stat.h index 61eea825..5b8c60f0 100644 --- a/lib/tsan/rtl/tsan_stat.h +++ b/lib/tsan/rtl/tsan_stat.h @@ -387,6 +387,7 @@ enum StatType { StatInt_ether_ntohost, StatInt_ether_hostton, StatInt_ether_line, + StatInt_shmctl, // Dynamic annotations. StatAnnotation, |