From 586ade114b1410860a7ef8a1ea1b9bd70124377f Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Mon, 23 Jan 2012 21:20:05 +0000 Subject: [PATCH] [asan] use internal_strcmp before asan_init is done. *may* fix asan issue #30 llvm-svn: 148726 --- compiler-rt/lib/asan/asan_interceptors.cc | 18 ++++++++++++++---- compiler-rt/lib/asan/asan_interceptors.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/compiler-rt/lib/asan/asan_interceptors.cc b/compiler-rt/lib/asan/asan_interceptors.cc index 746b1a000b5c..8cf0f5d60b89 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cc +++ b/compiler-rt/lib/asan/asan_interceptors.cc @@ -235,6 +235,18 @@ char *internal_strncat(char *dst, const char *src, size_t n) { return dst; } +int internal_strcmp(const char *s1, const char *s2) { + while (true) { + unsigned c1 = *s1; + unsigned c2 = *s2; + if (c1 != c2) return (c1 < c2) ? -1 : 1; + if (c1 == 0) break; + s1++; + s2++; + } + return 0; +} + } // namespace __asan // ---------------------- Wrappers ---------------- {{{1 @@ -490,10 +502,8 @@ char *WRAP(strcat)(char *to, const char *from) { // NOLINT extern "C" int WRAP(strcmp)(const char *s1, const char *s2) { - // strcmp is called from malloc_default_purgeable_zone() - // in __asan::ReplaceSystemAlloc() on Mac. - if (asan_init_is_running) { - return real_strcmp(s1, s2); + if (!asan_inited) { + return internal_strcmp(s1, s2); } unsigned char c1, c2; size_t i; diff --git a/compiler-rt/lib/asan/asan_interceptors.h b/compiler-rt/lib/asan/asan_interceptors.h index fb8a55759f3b..7f9e812eba73 100644 --- a/compiler-rt/lib/asan/asan_interceptors.h +++ b/compiler-rt/lib/asan/asan_interceptors.h @@ -70,6 +70,7 @@ void* internal_memchr(const void* s, int c, size_t n); int internal_memcmp(const void* s1, const void* s2, size_t n); char *internal_strstr(const char *haystack, const char *needle); char *internal_strncat(char *dst, const char *src, size_t n); +int internal_strcmp(const char *s1, const char *s2); void InitializeAsanInterceptors(); -- GitLab