[compiler-rt] r190022 - asan: Add a wcslen interceptor mirroring strlen

Reid Kleckner reid at kleckner.net
Wed Sep 4 18:13:50 PDT 2013


Author: rnk
Date: Wed Sep  4 20:13:49 2013
New Revision: 190022

URL: http://llvm.org/viewvc/llvm-project?rev=190022&view=rev
Log:
asan: Add a wcslen interceptor mirroring strlen

Tested on Linux, since I can't build the tests on Windows yet.

Modified:
    compiler-rt/trunk/lib/asan/asan_intercepted_functions.h
    compiler-rt/trunk/lib/asan/asan_interceptors.cc
    compiler-rt/trunk/lib/asan/tests/asan_str_test.cc

Modified: compiler-rt/trunk/lib/asan/asan_intercepted_functions.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_intercepted_functions.h?rev=190022&r1=190021&r2=190022&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_intercepted_functions.h (original)
+++ compiler-rt/trunk/lib/asan/asan_intercepted_functions.h Wed Sep  4 20:13:49 2013
@@ -99,6 +99,7 @@ char* strchr(const char *str, int c);
 int strcmp(const char *s1, const char* s2);
 char* strcpy(char *to, const char* from);  // NOLINT
 uptr strlen(const char *s);
+uptr wcslen(const wchar_t *s);
 char* strncat(char *to, const char* from, uptr size);
 int strncmp(const char *s1, const char* s2, uptr size);
 char* strncpy(char *to, const char* from, uptr size);

Modified: compiler-rt/trunk/lib/asan/asan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=190022&r1=190021&r2=190022&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_interceptors.cc Wed Sep  4 20:13:49 2013
@@ -482,6 +482,15 @@ INTERCEPTOR(uptr, strlen, const char *s)
   return length;
 }
 
+INTERCEPTOR(uptr, wcslen, const wchar_t *s) {
+  uptr length = REAL(wcslen)(s);
+  if (!asan_init_is_running) {
+    ENSURE_ASAN_INITED();
+    ASAN_READ_RANGE(s, (length + 1) * sizeof(wchar_t));
+  }
+  return length;
+}
+
 INTERCEPTOR(char*, strncpy, char *to, const char *from, uptr size) {
   ENSURE_ASAN_INITED();
   if (flags()->replace_str) {
@@ -680,6 +689,7 @@ void InitializeAsanInterceptors() {
   ASAN_INTERCEPT_FUNC(strchr);
   ASAN_INTERCEPT_FUNC(strcpy);  // NOLINT
   ASAN_INTERCEPT_FUNC(strlen);
+  ASAN_INTERCEPT_FUNC(wcslen);
   ASAN_INTERCEPT_FUNC(strncat);
   ASAN_INTERCEPT_FUNC(strncpy);
 #if ASAN_INTERCEPT_STRDUP

Modified: compiler-rt/trunk/lib/asan/tests/asan_str_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_str_test.cc?rev=190022&r1=190021&r2=190022&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/asan_str_test.cc (original)
+++ compiler-rt/trunk/lib/asan/tests/asan_str_test.cc Wed Sep  4 20:13:49 2013
@@ -61,6 +61,17 @@ TEST(AddressSanitizer, StrLenOOBTest) {
   free(heap_string);
 }
 
+TEST(AddressSanitizer, WcsLenTest) {
+  EXPECT_EQ(0, wcslen(Ident(L"")));
+  size_t hello_len = 13;
+  size_t hello_size = (hello_len + 1) * sizeof(wchar_t);
+  EXPECT_EQ(hello_len, wcslen(Ident(L"Hello, World!")));
+  wchar_t *heap_string = Ident((wchar_t*)malloc(hello_size));
+  memcpy(heap_string, L"Hello, World!", hello_size);
+  EXPECT_EQ(hello_len, Ident(wcslen(heap_string)));
+  EXPECT_DEATH(Ident(wcslen(heap_string + 14)), RightOOBReadMessage(0));
+}
+
 #ifndef __APPLE__
 TEST(AddressSanitizer, StrNLenOOBTest) {
   size_t size = Ident(123);





More information about the llvm-commits mailing list