[PATCH] D22363: [compiler-rt] Add internal wcslen to avoid crashing on windows 64-bits

Etienne Bergeron via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 14 09:03:57 PDT 2016


etienneb updated this revision to Diff 63989.
etienneb added a comment.

right fix


https://reviews.llvm.org/D22363

Files:
  lib/asan/asan_interceptors.cc
  lib/sanitizer_common/sanitizer_libc.cc
  lib/sanitizer_common/sanitizer_libc.h

Index: lib/sanitizer_common/sanitizer_libc.h
===================================================================
--- lib/sanitizer_common/sanitizer_libc.h
+++ lib/sanitizer_common/sanitizer_libc.h
@@ -51,6 +51,7 @@
 uptr internal_strnlen(const char *s, uptr maxlen);
 char *internal_strrchr(const char *s, int c);
 // This is O(N^2), but we are not using it in hot places.
+uptr internal_wcslen(const wchar_t *s);
 char *internal_strstr(const char *haystack, const char *needle);
 // Works only for base=10 and doesn't set errno.
 s64 internal_simple_strtoll(const char *nptr, char **endptr, int base);
Index: lib/sanitizer_common/sanitizer_libc.cc
===================================================================
--- lib/sanitizer_common/sanitizer_libc.cc
+++ lib/sanitizer_common/sanitizer_libc.cc
@@ -234,6 +234,12 @@
   return nullptr;
 }
 
+uptr internal_wcslen(const wchar_t *s) {
+  uptr i = 0;
+  while (s[i]) i++;
+  return i;
+}
+
 s64 internal_simple_strtoll(const char *nptr, char **endptr, int base) {
   CHECK_EQ(base, 10);
   while (IsSpace(*nptr)) nptr++;
Index: lib/asan/asan_interceptors.cc
===================================================================
--- lib/asan/asan_interceptors.cc
+++ lib/asan/asan_interceptors.cc
@@ -585,7 +585,12 @@
 INTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) {
   void *ctx;
   ASAN_INTERCEPTOR_ENTER(ctx, wcslen);
+#if SANITIZER_WINDOWS64
+  // The function is incorrectly hooked on windows 64-bit.
+  SIZE_T length = internal_wcslen(s);
+#else
   SIZE_T length = REAL(wcslen)(s);
+#endif
   if (!asan_init_is_running) {
     ENSURE_ASAN_INITED();
     ASAN_READ_RANGE(ctx, s, (length + 1) * sizeof(wchar_t));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22363.63989.patch
Type: text/x-patch
Size: 1668 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160714/04b79b0a/attachment.bin>


More information about the llvm-commits mailing list