[sanitizer] Add early call handling to strlen interceptor
authorDerek Bruening <bruening@google.com>
Thu, 7 Apr 2016 18:07:09 +0000 (18:07 +0000)
committerDerek Bruening <bruening@google.com>
Thu, 7 Apr 2016 18:07:09 +0000 (18:07 +0000)
Summary:
The strlen interceptor is sometimes invoked too early for REAL(strlen) to
be initialized.  A special check is added to use internal_strlen for this
situation.

Reviewers: dim

Subscribers: llvm-commits, samsonov

Differential Revision: http://reviews.llvm.org/D18851

Change-Id: I3acc58f4abbae1904f25324abd84efea67aad0a2
llvm-svn: 265705

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

index e531f04..2e0c48e 100644 (file)
@@ -206,6 +206,12 @@ UNUSED static void DeleteInterceptorMetadata(void *addr) {
 
 #if SANITIZER_INTERCEPT_STRLEN
 INTERCEPTOR(SIZE_T, strlen, const char *s) {
+  // Sometimes strlen is called prior to InitializeCommonInterceptors,
+  // in which case the REAL(strlen) typically used in
+  // COMMON_INTERCEPTOR_ENTER will fail.  We use internal_strlen here
+  // to handle that.
+  if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)
+    return internal_strlen(s);
   void *ctx;
   COMMON_INTERCEPTOR_ENTER(ctx, strlen, s);
   SIZE_T result = REAL(strlen)(s);