From: Derek Bruening Date: Thu, 7 Apr 2016 18:07:09 +0000 (+0000) Subject: [sanitizer] Add early call handling to strlen interceptor X-Git-Tag: llvmorg-3.9.0-rc1~9708 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a7685389c8ccdf02c48318c3603b41448f628ed7;p=platform%2Fupstream%2Fllvm.git [sanitizer] Add early call handling to strlen interceptor 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 --- diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index e531f047..2e0c48e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -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);