summaryrefslogtreecommitdiff
path: root/lib/msan
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-02-19 09:19:16 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-02-19 09:19:16 +0000
commit9358c58d0aaf1b20f17362af354d4c3c1309276a (patch)
tree060a2aaafcec73d77fa4483d3ac1b6015123d636 /lib/msan
parentce44055cdde85554aa9d18f8a7166bf5df6f9bb3 (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.txt1
-rw-r--r--lib/msan/msan_interceptors.cc46
-rw-r--r--lib/msan/msan_platform_limits_posix.cc59
-rw-r--r--lib/msan/msan_platform_limits_posix.h36
-rw-r--r--lib/msan/tests/msan_test.cc21
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;