diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-14 12:49:23 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-14 12:49:23 +0000 |
| commit | c6bce9359143e79cb332fbb1cc04db101e13ba00 (patch) | |
| tree | 5d7738e569f9e87392415e2d6ec62b999cf8fb05 | |
| parent | 1dc928e1b13cf91f67f73a691262731bc44c6b25 (diff) | |
| download | bcm5719-llvm-c6bce9359143e79cb332fbb1cc04db101e13ba00.tar.gz bcm5719-llvm-c6bce9359143e79cb332fbb1cc04db101e13ba00.zip | |
[msan] Intercept readdir64.
llvm-svn: 177065
| -rw-r--r-- | compiler-rt/lib/msan/lit_tests/readdir64.cc | 27 | ||||
| -rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cc | 8 | ||||
| -rw-r--r-- | compiler-rt/lib/msan/tests/msan_test.cc | 10 |
3 files changed, 45 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/lit_tests/readdir64.cc b/compiler-rt/lib/msan/lit_tests/readdir64.cc new file mode 100644 index 00000000000..0ec106c741f --- /dev/null +++ b/compiler-rt/lib/msan/lit_tests/readdir64.cc @@ -0,0 +1,27 @@ +// RUN: %clangxx_msan -m64 -O0 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O1 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O2 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O3 %s -o %t && %t + +// RUN: %clangxx_msan -m64 -O0 -D_FILE_OFFSET_BITS=64 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O1 -D_FILE_OFFSET_BITS=64 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O2 -D_FILE_OFFSET_BITS=64 %s -o %t && %t +// RUN: %clangxx_msan -m64 -O3 -D_FILE_OFFSET_BITS=64 %s -o %t && %t + +// Test that readdir64 is intercepted as well as readdir. + +#include <sys/types.h> +#include <dirent.h> +#include <stdlib.h> + + +int main(void) { + DIR *dir = opendir("."); + struct dirent *d = readdir(dir); + if (d->d_name[0]) { + closedir(dir); + exit(0); + } + closedir(dir); + return 0; +} diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index afe45d54f2f..287d2d26189 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -91,6 +91,13 @@ INTERCEPTOR(void *, readdir, void *a) { return res; } +INTERCEPTOR(void *, readdir64, void *a) { + ENSURE_MSAN_INITED(); + void *res = REAL(readdir)(a); + __msan_unpoison(res, __sanitizer::struct_dirent64_sz); + return res; +} + INTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { return __msan_memcpy(dest, src, n); } @@ -983,6 +990,7 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(fread_unlocked); INTERCEPT_FUNCTION(readlink); INTERCEPT_FUNCTION(readdir); + INTERCEPT_FUNCTION(readdir64); INTERCEPT_FUNCTION(memcpy); INTERCEPT_FUNCTION(memset); INTERCEPT_FUNCTION(memmove); diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index a467e0d102f..3380c13f1c6 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -35,6 +35,8 @@ #include <sys/utsname.h> #include <sys/mman.h> #include <sys/vfs.h> +#include <sys/types.h> +#include <dirent.h> #if defined(__i386__) || defined(__x86_64__) # include <emmintrin.h> @@ -613,6 +615,14 @@ TEST(MemorySanitizer, getcwd_gnu) { free(res); } +TEST(MemorySanitizer, readdir) { + DIR *dir = opendir("."); + struct dirent *d = readdir(dir); + assert(d); + EXPECT_NOT_POISONED(d->d_name[0]); + closedir(dir); +} + TEST(MemorySanitizer, realpath) { const char* relpath = "."; char path[PATH_MAX + 1]; |

