diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-14 14:59:42 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-14 14:59:42 +0000 |
commit | 7150460139d3aec28029205c6acde55c21753ee3 (patch) | |
tree | 6041fea457429bd0ef477d21a817ee213a3f2e89 /lib | |
parent | 36e713091c3aa1e27c0743663e4ca2ebf8e87066 (diff) |
[msan] Intercept wcsftime().
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@206179 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msan/msan_interceptors.cc | 45 | ||||
-rw-r--r-- | lib/msan/tests/msan_test.cc | 11 |
2 files changed, 51 insertions, 5 deletions
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 580a7f881..5205094fb 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -453,13 +453,43 @@ INTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { return res; } -// SIZE_T strftime(char *s, SIZE_T max, const char *format,const struct tm *tm); +#define INTERCEPTOR_STRFTIME_BODY(char_type, ret_type, func, s, ...) \ + ENSURE_MSAN_INITED(); \ + ret_type res = REAL(func)(s, __VA_ARGS__); \ + if (s) __msan_unpoison(s, sizeof(char_type) * (res + 1)); \ + return res; + INTERCEPTOR(SIZE_T, strftime, char *s, SIZE_T max, const char *format, __sanitizer_tm *tm) { - ENSURE_MSAN_INITED(); - SIZE_T res = REAL(strftime)(s, max, format, tm); - if (res) __msan_unpoison(s, res + 1); - return res; + INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, strftime, s, max, format, tm); +} + +INTERCEPTOR(SIZE_T, strftime_l, char *s, SIZE_T max, const char *format, + __sanitizer_tm *tm, void *loc) { + INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, strftime_l, s, max, format, tm, loc); +} + +INTERCEPTOR(SIZE_T, __strftime_l, char *s, SIZE_T max, const char *format, + __sanitizer_tm *tm, void *loc) { + INTERCEPTOR_STRFTIME_BODY(char, SIZE_T, __strftime_l, s, max, format, tm, + loc); +} + +INTERCEPTOR(SIZE_T, wcsftime, wchar_t *s, SIZE_T max, const wchar_t *format, + __sanitizer_tm *tm) { + INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, wcsftime, s, max, format, tm); +} + +INTERCEPTOR(SIZE_T, wcsftime_l, wchar_t *s, SIZE_T max, const wchar_t *format, + __sanitizer_tm *tm, void *loc) { + INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, wcsftime_l, s, max, format, tm, + loc); +} + +INTERCEPTOR(SIZE_T, __wcsftime_l, wchar_t *s, SIZE_T max, const wchar_t *format, + __sanitizer_tm *tm, void *loc) { + INTERCEPTOR_STRFTIME_BODY(wchar_t, SIZE_T, __wcsftime_l, s, max, format, tm, + loc); } INTERCEPTOR(int, mbtowc, wchar_t *dest, const char *src, SIZE_T n) { @@ -1518,6 +1548,11 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(snprintf); INTERCEPT_FUNCTION(swprintf); INTERCEPT_FUNCTION(strftime); + INTERCEPT_FUNCTION(strftime_l); + INTERCEPT_FUNCTION(__strftime_l); + INTERCEPT_FUNCTION(wcsftime); + INTERCEPT_FUNCTION(wcsftime_l); + INTERCEPT_FUNCTION(__wcsftime_l); INTERCEPT_FUNCTION(mbtowc); INTERCEPT_FUNCTION(mbrtowc); INTERCEPT_FUNCTION(wcslen); diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index 1c2dd2652..24cd65d77 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -1859,6 +1859,17 @@ TEST(MemorySanitizer, mbrtowc) { EXPECT_NOT_POISONED(wx); } +TEST(MemorySanitizer, wcsftime) { + wchar_t x[100]; + time_t t = time(NULL); + struct tm tms; + struct tm *tmres = localtime_r(&t, &tms); + ASSERT_NE((void *)0, tmres); + size_t res = wcsftime(x, sizeof(x) / sizeof(x[0]), L"%Y-%m-%d", tmres); + EXPECT_GT(res, 0UL); + EXPECT_EQ(res, wcslen(x)); +} + TEST(MemorySanitizer, gettimeofday) { struct timeval tv; struct timezone tz; |