diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-08-12 11:01:40 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-08-12 11:01:40 +0000 |
| commit | 98c39a184eb5c6d8c3400b21e995f7838ffeeedc (patch) | |
| tree | a82990861d112c9dc98b85c57fdf2d770142fde0 | |
| parent | 173cf4077fb59b3b8d40fee355bbcd84353cdbfd (diff) | |
| download | bcm5719-llvm-98c39a184eb5c6d8c3400b21e995f7838ffeeedc.tar.gz bcm5719-llvm-98c39a184eb5c6d8c3400b21e995f7838ffeeedc.zip | |
[sanitizer] Intercept getgroups.
llvm-svn: 188167
5 files changed, 28 insertions, 1 deletions
diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index f8e5622e8c0..f2b96eda81c 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -2275,6 +2275,15 @@ TEST(MemorySanitizer, getgrnam_r) { EXPECT_NOT_POISONED(grp.gr_gid); } +TEST(MemorySanitizer, getgroups) { + int n = getgroups(0, 0); + gid_t *gids = new gid_t[n]; + int res = getgroups(n, gids); + ASSERT_EQ(n, res); + for (int i = 0; i < n; ++i) + EXPECT_NOT_POISONED(gids[i]); +} + template<class T> static bool applySlt(T value, T shadow) { __msan_partial_poison(&value, &shadow, sizeof(T)); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 4fb3f34c893..80ae0664295 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -1923,6 +1923,20 @@ INTERCEPTOR(int, scandir64, char *dirp, __sanitizer_dirent64 ***namelist, #define INIT_SCANDIR64 #endif +#if SANITIZER_INTERCEPT_GETGROUPS +INTERCEPTOR(int, getgroups, int size, u32 *lst) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, getgroups, size, lst); + int res = REAL(getgroups)(size, lst); + if (res && lst) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lst, res * sizeof(*lst)); + return res; +} +#define INIT_GETGROUPS INTERCEPT_FUNCTION(getgroups); +#else +#define INIT_GETGROUPS +#endif + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCMP; \ INIT_STRNCMP; \ @@ -1987,4 +2001,5 @@ INTERCEPTOR(int, scandir64, char *dirp, __sanitizer_dirent64 ***namelist, INIT_STRERROR; \ INIT_STRERROR_R; \ INIT_SCANDIR; \ - INIT_SCANDIR64; + INIT_SCANDIR64; \ + INIT_GETGROUPS; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 10d60eee6c3..71df9e6d876 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -115,5 +115,6 @@ # define SANITIZER_INTERCEPT_STRERROR_R SI_NOT_WINDOWS # define SANITIZER_INTERCEPT_SCANDIR SI_LINUX_NOT_ANDROID # define SANITIZER_INTERCEPT_SCANDIR64 SI_LINUX_NOT_ANDROID +# define SANITIZER_INTERCEPT_GETGROUPS SI_NOT_WINDOWS #endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.cc b/compiler-rt/lib/tsan/rtl/tsan_stat.cc index 40aa488716b..f91a70761df 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.cc @@ -358,6 +358,7 @@ void StatOutput(u64 *stat) { name[StatInt_strerror_r] = " strerror_r "; name[StatInt_scandir] = " scandir "; name[StatInt_scandir64] = " scandir64 "; + name[StatInt_getgroups] = " getgroups "; name[StatAnnotation] = "Dynamic annotations "; name[StatAnnotateHappensBefore] = " HappensBefore "; diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.h b/compiler-rt/lib/tsan/rtl/tsan_stat.h index 6ae9ecdf07e..b0240e99b59 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.h +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.h @@ -353,6 +353,7 @@ enum StatType { StatInt_strerror_r, StatInt_scandir, StatInt_scandir64, + StatInt_getgroups, // Dynamic annotations. StatAnnotation, |

