diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-02-19 09:19:16 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-02-19 09:19:16 +0000 |
commit | 9358c58d0aaf1b20f17362af354d4c3c1309276a (patch) | |
tree | 060a2aaafcec73d77fa4483d3ac1b6015123d636 /lib/msan | |
parent | ce44055cdde85554aa9d18f8a7166bf5df6f9bb3 (diff) |
[sanitizer] Add interceptors for localtime and friends.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@175499 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan')
-rw-r--r-- | lib/msan/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/msan/msan_interceptors.cc | 46 | ||||
-rw-r--r-- | lib/msan/msan_platform_limits_posix.cc | 59 | ||||
-rw-r--r-- | lib/msan/msan_platform_limits_posix.h | 36 | ||||
-rw-r--r-- | lib/msan/tests/msan_test.cc | 21 |
5 files changed, 44 insertions, 119 deletions
diff --git a/lib/msan/CMakeLists.txt b/lib/msan/CMakeLists.txt index 5677e5787..fa057a652 100644 --- a/lib/msan/CMakeLists.txt +++ b/lib/msan/CMakeLists.txt @@ -7,7 +7,6 @@ set(MSAN_RTL_SOURCES msan_interceptors.cc msan_linux.cc msan_new_delete.cc - msan_platform_limits_posix.cc msan_report.cc ) set(MSAN_RTL_CFLAGS diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 7521d0e0d..a6f25e8aa 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -17,7 +17,7 @@ #include "interception/interception.h" #include "msan.h" -#include "msan_platform_limits_posix.h" +#include "sanitizer_common/sanitizer_platform_limits_posix.h" #include "sanitizer_common/sanitizer_allocator.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_stackdepot.h" @@ -87,7 +87,7 @@ INTERCEPTOR(SSIZE_T, readlink, const char *path, char *buf, SIZE_T bufsiz) { INTERCEPTOR(void *, readdir, void *a) { ENSURE_MSAN_INITED(); void *res = REAL(readdir)(a); - __msan_unpoison(res, __msan::struct_dirent_sz); + __msan_unpoison(res, __sanitizer::struct_dirent_sz); return res; } @@ -452,7 +452,7 @@ INTERCEPTOR(int, __fxstat, int magic, int fd, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__fxstat)(magic, fd, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat_sz); + __msan_unpoison(buf, __sanitizer::struct_stat_sz); return res; } @@ -460,7 +460,7 @@ INTERCEPTOR(int, __fxstat64, int magic, int fd, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__fxstat64)(magic, fd, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat64_sz); + __msan_unpoison(buf, __sanitizer::struct_stat64_sz); return res; } @@ -468,7 +468,7 @@ INTERCEPTOR(int, __xstat, int magic, char *path, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__xstat)(magic, path, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat_sz); + __msan_unpoison(buf, __sanitizer::struct_stat_sz); return res; } @@ -476,7 +476,7 @@ INTERCEPTOR(int, __xstat64, int magic, char *path, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__xstat64)(magic, path, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat64_sz); + __msan_unpoison(buf, __sanitizer::struct_stat64_sz); return res; } @@ -484,7 +484,7 @@ INTERCEPTOR(int, __lxstat, int magic, char *path, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__lxstat)(magic, path, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat_sz); + __msan_unpoison(buf, __sanitizer::struct_stat_sz); return res; } @@ -492,7 +492,7 @@ INTERCEPTOR(int, __lxstat64, int magic, char *path, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(__lxstat64)(magic, path, buf); if (!res) - __msan_unpoison(buf, __msan::struct_stat64_sz); + __msan_unpoison(buf, __sanitizer::struct_stat64_sz); return res; } @@ -562,7 +562,7 @@ INTERCEPTOR(int, getrlimit, int resource, void *rlim) { ENSURE_MSAN_INITED(); int res = REAL(getrlimit)(resource, rlim); if (!res) - __msan_unpoison(rlim, __msan::struct_rlimit_sz); + __msan_unpoison(rlim, __sanitizer::struct_rlimit_sz); return res; } @@ -572,7 +572,7 @@ INTERCEPTOR(int, getrlimit64, int resource, void *rlim) { ENSURE_MSAN_INITED(); int res = REAL(getrlimit64)(resource, rlim); if (!res) - __msan_unpoison(rlim, __msan::struct_rlimit64_sz); + __msan_unpoison(rlim, __sanitizer::struct_rlimit64_sz); return res; } @@ -580,7 +580,7 @@ INTERCEPTOR(int, statfs, const char *s, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(statfs)(s, buf); if (!res) - __msan_unpoison(buf, __msan::struct_statfs_sz); + __msan_unpoison(buf, __sanitizer::struct_statfs_sz); return res; } @@ -588,7 +588,7 @@ INTERCEPTOR(int, fstatfs, int fd, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(fstatfs)(fd, buf); if (!res) - __msan_unpoison(buf, __msan::struct_statfs_sz); + __msan_unpoison(buf, __sanitizer::struct_statfs_sz); return res; } @@ -596,7 +596,7 @@ INTERCEPTOR(int, statfs64, const char *s, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(statfs64)(s, buf); if (!res) - __msan_unpoison(buf, __msan::struct_statfs64_sz); + __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); return res; } @@ -604,7 +604,7 @@ INTERCEPTOR(int, fstatfs64, int fd, void *buf) { ENSURE_MSAN_INITED(); int res = REAL(fstatfs64)(fd, buf); if (!res) - __msan_unpoison(buf, __msan::struct_statfs64_sz); + __msan_unpoison(buf, __sanitizer::struct_statfs64_sz); return res; } @@ -612,7 +612,7 @@ INTERCEPTOR(int, uname, void *utsname) { ENSURE_MSAN_INITED(); int res = REAL(uname)(utsname); if (!res) { - __msan_unpoison(utsname, __msan::struct_utsname_sz); + __msan_unpoison(utsname, __sanitizer::struct_utsname_sz); } return res; } @@ -634,7 +634,7 @@ INTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents, ENSURE_MSAN_INITED(); int res = REAL(epoll_wait)(epfd, events, maxevents, timeout); if (res > 0) { - __msan_unpoison(events, __msan::struct_epoll_event_sz * res); + __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); } return res; } @@ -644,7 +644,7 @@ INTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents, ENSURE_MSAN_INITED(); int res = REAL(epoll_pwait)(epfd, events, maxevents, timeout, sigmask); if (res > 0) { - __msan_unpoison(events, __msan::struct_epoll_event_sz * res); + __msan_unpoison(events, __sanitizer::struct_epoll_event_sz * res); } return res; } @@ -662,12 +662,12 @@ INTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, ENSURE_MSAN_INITED(); SIZE_T srcaddr_sz; if (srcaddr) - srcaddr_sz = __msan_get_socklen_t(addrlen); + srcaddr_sz = __sanitizer_get_socklen_t(addrlen); SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); if (res > 0) { __msan_unpoison(buf, res); if (srcaddr) { - SIZE_T sz = __msan_get_socklen_t(addrlen); + SIZE_T sz = __sanitizer_get_socklen_t(addrlen); __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); } } @@ -678,9 +678,9 @@ INTERCEPTOR(SSIZE_T, recvmsg, int fd, struct msghdr *msg, int flags) { ENSURE_MSAN_INITED(); SSIZE_T res = REAL(recvmsg)(fd, msg, flags); if (res > 0) { - for (SIZE_T i = 0; i < __msan_get_msghdr_iovlen(msg); ++i) - __msan_unpoison(__msan_get_msghdr_iov_iov_base(msg, i), - __msan_get_msghdr_iov_iov_len(msg, i)); + for (SIZE_T i = 0; i < __sanitizer_get_msghdr_iovlen(msg); ++i) + __msan_unpoison(__sanitizer_get_msghdr_iov_iov_base(msg, i), + __sanitizer_get_msghdr_iov_iov_len(msg, i)); } return res; } @@ -766,7 +766,7 @@ INTERCEPTOR(int, getrusage, int who, void *usage) { ENSURE_MSAN_INITED(); int res = REAL(getrusage)(who, usage); if (res == 0) { - __msan_unpoison(usage, __msan::struct_rusage_sz); + __msan_unpoison(usage, __sanitizer::struct_rusage_sz); } return res; } diff --git a/lib/msan/msan_platform_limits_posix.cc b/lib/msan/msan_platform_limits_posix.cc deleted file mode 100644 index d37d42049..000000000 --- a/lib/msan/msan_platform_limits_posix.cc +++ /dev/null @@ -1,59 +0,0 @@ -//===-- msan_platform_limits.cc -------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file is a part of MemorySanitizer. -// -// Sizes and layouts of platform-specific POSIX data structures. -//===----------------------------------------------------------------------===// - -#ifdef __linux__ - -#include "msan.h" -#include "msan_platform_limits_posix.h" - -#include <sys/utsname.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/vfs.h> -#include <sys/epoll.h> -#include <sys/socket.h> -#include <dirent.h> - -namespace __msan { - unsigned struct_utsname_sz = sizeof(struct utsname); - unsigned struct_stat_sz = sizeof(struct stat); - unsigned struct_stat64_sz = sizeof(struct stat64); - unsigned struct_rlimit_sz = sizeof(struct rlimit); - unsigned struct_rlimit64_sz = sizeof(struct rlimit64); - unsigned struct_dirent_sz = sizeof(struct dirent); - unsigned struct_statfs_sz = sizeof(struct statfs); - unsigned struct_statfs64_sz = sizeof(struct statfs64); - unsigned struct_epoll_event_sz = sizeof(struct epoll_event); - unsigned struct_rusage_sz = sizeof(struct rusage); - - void* __msan_get_msghdr_iov_iov_base(void* msg, int idx) { - return ((struct msghdr *)msg)->msg_iov[idx].iov_base; - } - - uptr __msan_get_msghdr_iov_iov_len(void* msg, int idx) { - return ((struct msghdr *)msg)->msg_iov[idx].iov_len; - } - - uptr __msan_get_msghdr_iovlen(void* msg) { - return ((struct msghdr *)msg)->msg_iovlen; - } - - uptr __msan_get_socklen_t(void* socklen_ptr) { - return *(socklen_t*)socklen_ptr; - } -} // namespace __msan - -#endif // __linux__ diff --git a/lib/msan/msan_platform_limits_posix.h b/lib/msan/msan_platform_limits_posix.h deleted file mode 100644 index 3cd90ce93..000000000 --- a/lib/msan/msan_platform_limits_posix.h +++ /dev/null @@ -1,36 +0,0 @@ -//===-- msan_platform_limits.h ----------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file is a part of MemorySanitizer. -// -// Sizes and layouts of platform-specific data structures. -//===----------------------------------------------------------------------===// - -#ifndef MSAN_PLATFORM_LIMITS_H -#define MSAN_PLATFORM_LIMITS_H - -namespace __msan { - extern unsigned struct_utsname_sz; - extern unsigned struct_stat_sz; - extern unsigned struct_stat64_sz; - extern unsigned struct_rlimit_sz; - extern unsigned struct_rlimit64_sz; - extern unsigned struct_dirent_sz; - extern unsigned struct_statfs_sz; - extern unsigned struct_statfs64_sz; - extern unsigned struct_epoll_event_sz; - extern unsigned struct_rusage_sz; - - void* __msan_get_msghdr_iov_iov_base(void* msg, int idx); - uptr __msan_get_msghdr_iov_iov_len(void* msg, int idx); - uptr __msan_get_msghdr_iovlen(void* msg); - uptr __msan_get_socklen_t(void* socklen_ptr); -} // namespace __msan - -#endif diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index 7fa6cd2c4..b30a8dffd 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -807,6 +807,27 @@ TEST(MemorySanitizer, gettimeofday) { EXPECT_NOT_POISONED(tz.tz_dsttime); } +TEST(MemorySanitizer, localtime) { + time_t t = 123; + struct tm *time = localtime(&t); + assert(time != 0); + EXPECT_NOT_POISONED(time->tm_sec); + EXPECT_NOT_POISONED(time->tm_hour); + EXPECT_NOT_POISONED(time->tm_year); + EXPECT_NOT_POISONED(time->tm_isdst); +} + +TEST(MemorySanitizer, localtime_r) { + time_t t = 123; + struct tm time; + struct tm *res = localtime_r(&t, &time); + assert(res != 0); + EXPECT_NOT_POISONED(time.tm_sec); + EXPECT_NOT_POISONED(time.tm_hour); + EXPECT_NOT_POISONED(time.tm_year); + EXPECT_NOT_POISONED(time.tm_isdst); +} + TEST(MemorySanitizer, mmap) { const int size = 4096; void *p1, *p2; |