[compiler-rt] r326853 - [sanitizer] Move strxfrm interceptors into sanitizer_common

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 6 16:14:30 PST 2018


Author: vitalybuka
Date: Tue Mar  6 16:14:30 2018
New Revision: 326853

URL: http://llvm.org/viewvc/llvm-project?rev=326853&view=rev
Log:
[sanitizer] Move strxfrm interceptors into sanitizer_common

Added:
    compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/strxfrm.c
Modified:
    compiler-rt/trunk/lib/msan/msan_interceptors.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h

Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=326853&r1=326852&r2=326853&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Tue Mar  6 16:14:30 2018
@@ -481,37 +481,6 @@ INTERCEPTOR(int, swprintf, void *str, up
   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;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=326853&r1=326852&r2=326853&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Tue Mar  6 16:14:30 2018
@@ -6529,17 +6529,64 @@ INTERCEPTOR(wchar_t *, wcsncat, wchar_t
 #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 *
   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 *
 #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;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=326853&r1=326852&r2=326853&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Tue Mar  6 16:14:30 2018
@@ -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 \

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/strxfrm.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/strxfrm.c?rev=326853&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/strxfrm.c (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/strxfrm.c Tue Mar  6 16:14:30 2018
@@ -0,0 +1,19 @@
+// RUN: %clang -O0 %s -o %t && %run %t
+
+#include <assert.h>
+#include <locale.h>
+#include <wchar.h>
+
+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;
+}




More information about the llvm-commits mailing list