From 2e5f44653b2bfd6e109bf5fd7e6ab786bb20ec61 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Wed, 7 Mar 2018 00:14:30 +0000 Subject: [PATCH] [sanitizer] Move strxfrm interceptors into sanitizer_common llvm-svn: 326853 --- compiler-rt/lib/msan/msan_interceptors.cc | 34 ---------- .../sanitizer_common_interceptors.inc | 74 ++++++++++++++++++++-- .../sanitizer_platform_interceptors.h | 3 + .../sanitizer_common/TestCases/Posix/strxfrm.c | 19 ++++++ 4 files changed, 92 insertions(+), 38 deletions(-) create mode 100644 compiler-rt/test/sanitizer_common/TestCases/Posix/strxfrm.c diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index dce9e8a..5d4a43d 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -481,37 +481,6 @@ INTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) { return res; } -INTERCEPTOR(SIZE_T, strxfrm, char *dest, const char *src, SIZE_T n) { - ENSURE_MSAN_INITED(); - CHECK_UNPOISONED(src, REAL(strlen)(src) + 1); - SIZE_T res = REAL(strxfrm)(dest, src, n); - if (res < n) __msan_unpoison(dest, res + 1); - return res; -} - -INTERCEPTOR(SIZE_T, strxfrm_l, char *dest, const char *src, SIZE_T n, - void *loc) { - ENSURE_MSAN_INITED(); - CHECK_UNPOISONED(src, REAL(strlen)(src) + 1); - SIZE_T res = REAL(strxfrm_l)(dest, src, n, loc); - if (res < n) __msan_unpoison(dest, res + 1); - return res; -} - -#if SANITIZER_LINUX -INTERCEPTOR(SIZE_T, __strxfrm_l, char *dest, const char *src, SIZE_T n, - void *loc) { - ENSURE_MSAN_INITED(); - CHECK_UNPOISONED(src, REAL(strlen)(src) + 1); - SIZE_T res = REAL(__strxfrm_l)(dest, src, n, loc); - if (res < n) __msan_unpoison(dest, res + 1); - return res; -} -#define MSAN_MAYBE_INTERCEPT___STRXFRM_L INTERCEPT_FUNCTION(__strxfrm_l) -#else -#define MSAN_MAYBE_INTERCEPT___STRXFRM_L -#endif - #define INTERCEPTOR_STRFTIME_BODY(char_type, ret_type, func, s, ...) \ ENSURE_MSAN_INITED(); \ InterceptorScope interceptor_scope; \ @@ -1611,9 +1580,6 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(vswprintf); INTERCEPT_FUNCTION(swprintf); #endif - INTERCEPT_FUNCTION(strxfrm); - INTERCEPT_FUNCTION(strxfrm_l); - MSAN_MAYBE_INTERCEPT___STRXFRM_L; INTERCEPT_FUNCTION(strftime); INTERCEPT_FUNCTION(strftime_l); MSAN_MAYBE_INTERCEPT___STRFTIME_L; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 6df0971..55013c3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -6529,17 +6529,64 @@ INTERCEPTOR(wchar_t *, wcsncat, wchar_t *dst, const wchar_t *src, SIZE_T n) { #define INIT_WCSCAT #endif +#if SANITIZER_INTERCEPT_STRXFRM +INTERCEPTOR(SIZE_T, strxfrm, char *dest, const char *src, SIZE_T len) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, strxfrm, dest, src, len); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(char) * (REAL(strlen)(src) + 1)); + SIZE_T res = REAL(strxfrm)(dest, src, len); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(char) * (res + 1)); + return res; +} + +INTERCEPTOR(SIZE_T, strxfrm_l, char *dest, const char *src, SIZE_T len, + void *locale) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, strxfrm_l, dest, src, len, locale); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(char) * (REAL(strlen)(src) + 1)); + SIZE_T res = REAL(strxfrm_l)(dest, src, len, locale); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(char) * (res + 1)); + return res; +} + +#define INIT_STRXFRM \ + COMMON_INTERCEPT_FUNCTION(strxfrm); \ + COMMON_INTERCEPT_FUNCTION(strxfrm_l); +#else +#define INIT_STRXFRM +#endif + +#if SANITIZER_INTERCEPT___STRXFRM_L +INTERCEPTOR(SIZE_T, __strxfrm_l, char *dest, const char *src, SIZE_T len, + void *locale) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, __strxfrm_l, dest, src, len, locale); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(char) * (REAL(strlen)(src) + 1)); + SIZE_T res = REAL(__strxfrm_l)(dest, src, len, locale); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(char) * (res + 1)); + return res; +} + +#define INIT___STRXFRM_L COMMON_INTERCEPT_FUNCTION(__strxfrm_l); +#else +#define INIT___STRXFRM_L +#endif + #if SANITIZER_INTERCEPT_WCSXFRM INTERCEPTOR(SIZE_T, wcsxfrm, wchar_t *dest, const wchar_t *src, SIZE_T len) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, wcsxfrm, dest, src, len); COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); - SIZE_T res = REAL(wcsxfrm)(dest, src, len); if (res < len) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(wchar_t) * (res + 1)); - return res; } @@ -6549,11 +6596,9 @@ INTERCEPTOR(SIZE_T, wcsxfrm_l, wchar_t *dest, const wchar_t *src, SIZE_T len, COMMON_INTERCEPTOR_ENTER(ctx, wcsxfrm_l, dest, src, len, locale); COMMON_INTERCEPTOR_READ_RANGE(ctx, src, sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); - SIZE_T res = REAL(wcsxfrm_l)(dest, src, len, locale); if (res < len) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(wchar_t) * (res + 1)); - return res; } @@ -6564,6 +6609,24 @@ INTERCEPTOR(SIZE_T, wcsxfrm_l, wchar_t *dest, const wchar_t *src, SIZE_T len, #define INIT_WCSXFRM #endif +#if SANITIZER_INTERCEPT___WCSXFRM_L +INTERCEPTOR(SIZE_T, __wcsxfrm_l, wchar_t *dest, const wchar_t *src, SIZE_T len, + void *locale) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, __wcsxfrm_l, dest, src, len, locale); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); + SIZE_T res = REAL(__wcsxfrm_l)(dest, src, len, locale); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(wchar_t) * (res + 1)); + return res; +} + +#define INIT___WCSXFRM_L COMMON_INTERCEPT_FUNCTION(__wcsxfrm_l); +#else +#define INIT___WCSXFRM_L +#endif + #if SANITIZER_INTERCEPT_ACCT INTERCEPTOR(int, acct, const char *file) { void *ctx; @@ -7118,6 +7181,8 @@ static void InitializeCommonInterceptors() { INIT_STRSPN; INIT_STRTOK; INIT_STRPBRK; + INIT_STRXFRM; + INIT___STRXFRM_L; INIT_MEMSET; INIT_MEMMOVE; INIT_MEMCPY; @@ -7311,6 +7376,7 @@ static void InitializeCommonInterceptors() { INIT_WCSLEN; INIT_WCSCAT; INIT_WCSXFRM; + INIT___WCSXFRM_L; INIT_ACCT; INIT_USER_FROM_UID; INIT_UID_FROM_USER; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index fd3cedc..a6f4aef 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -246,7 +246,10 @@ #define SANITIZER_INTERCEPT_MBSNRTOWCS \ (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS) #define SANITIZER_INTERCEPT_WCSTOMBS SI_POSIX +#define SANITIZER_INTERCEPT_STRXFRM SI_POSIX +#define SANITIZER_INTERCEPT___STRXFRM_L SI_LINUX #define SANITIZER_INTERCEPT_WCSXFRM SI_POSIX +#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX #define SANITIZER_INTERCEPT_WCSNRTOMBS \ (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS) #define SANITIZER_INTERCEPT_WCRTOMB \ diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/strxfrm.c b/compiler-rt/test/sanitizer_common/TestCases/Posix/strxfrm.c new file mode 100644 index 0000000..8d067ca --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/strxfrm.c @@ -0,0 +1,19 @@ +// RUN: %clang -O0 %s -o %t && %run %t + +#include +#include +#include + +int main(int argc, char **argv) { + char q[10]; + size_t n = strxfrm(q, "abcdef", sizeof(q)); + assert(n < sizeof(q)); + + char q2[10]; + locale_t loc = newlocale(LC_ALL_MASK, "", (locale_t)0); + n = strxfrm_l(q2, L"qwerty", sizeof(q), loc); + assert(n < sizeof(q2)); + + freelocale(loc); + return 0; +} -- 2.7.4