diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-09-09 13:40:41 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-09-09 13:40:41 +0000 |
commit | bb22942b91bf0855da4a9da132c77f325b187b84 (patch) | |
tree | 86e34bc0fefc368965ae0700b5e11e8c27418ca7 | |
parent | d9a5e243254764ab1024320ef34bc2a87180f4c5 (diff) |
[msan] Intercept fstatat / fstatat64.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@190306 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/msan/msan_interceptors.cc | 18 | ||||
-rw-r--r-- | lib/msan/tests/msan_test.cc | 12 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 078e6d453..002c41c5b 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -602,6 +602,22 @@ INTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { return res; } +INTERCEPTOR(int, __fxstatat, int magic, int fd, char *pathname, void *buf, + int flags) { + ENSURE_MSAN_INITED(); + int res = REAL(__fxstatat)(magic, fd, pathname, buf, flags); + if (!res) __msan_unpoison(buf, __sanitizer::struct_stat_sz); + return res; +} + +INTERCEPTOR(int, __fxstatat64, int magic, int fd, char *pathname, void *buf, + int flags) { + ENSURE_MSAN_INITED(); + int res = REAL(__fxstatat64)(magic, fd, pathname, buf, flags); + if (!res) __msan_unpoison(buf, __sanitizer::struct_stat64_sz); + return res; +} + INTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__xstat)(magic, path, buf); @@ -1274,9 +1290,11 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(gettimeofday); INTERCEPT_FUNCTION(fcvt); INTERCEPT_FUNCTION(__fxstat); + INTERCEPT_FUNCTION(__fxstatat); INTERCEPT_FUNCTION(__xstat); INTERCEPT_FUNCTION(__lxstat); INTERCEPT_FUNCTION(__fxstat64); + INTERCEPT_FUNCTION(__fxstatat64); INTERCEPT_FUNCTION(__xstat64); INTERCEPT_FUNCTION(__lxstat64); INTERCEPT_FUNCTION(pipe); diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index 64fe4b5c8..d907fe797 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -672,6 +672,18 @@ TEST(MemorySanitizer, stat) { EXPECT_NOT_POISONED(st->st_size); } +TEST(MemorySanitizer, fstatat) { + struct stat* st = new struct stat; + int dirfd = open("/proc/self", O_RDONLY); + assert(dirfd > 0); + int res = fstatat(dirfd, "stat", st, 0); + assert(!res); + EXPECT_NOT_POISONED(st->st_dev); + EXPECT_NOT_POISONED(st->st_mode); + EXPECT_NOT_POISONED(st->st_size); + close(dirfd); +} + TEST(MemorySanitizer, statfs) { struct statfs* st = new struct statfs; int res = statfs("/", st); |