Skip to content

Commit

Permalink
[sanitizer] Add strlen to the common interceptors
Browse files Browse the repository at this point in the history
Summary:
Adds strlen to the common interceptors, under a new common flag
intercept_strlen.  This provides better sharing of interception code among
sanitizers and cleans up the inconsistent type declarations of the
previously duplicated interceptors.

Removes the now-duplicate strlen interceptor from asan, msan, and tsan.
The entry check semantics are normalized now for msan and asan, whose
private strlen interceptors contained multiple layers of checks that
included impossible-to-reach code.  The new semantics are identical to the
old: bypass interception if in the middle of init or if both on Mac and not
initialized; else, call the init routine and proceed.

Patch by Derek Bruening!

Reviewers: samsonov, vitalybuka

Subscribers: llvm-commits, kcc, zhaoqin

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

llvm-svn: 263177
  • Loading branch information
vonosmas committed Mar 11, 2016
1 parent 92a4699 commit ed3d347
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 37 deletions.
4 changes: 4 additions & 0 deletions compiler-rt/lib/asan/asan_flags.cc
Expand Up @@ -159,6 +159,10 @@ void InitializeFlags() {
(ASAN_LOW_MEMORY) ? 1UL << 6 : 1UL << 8;
f->quarantine_size_mb = kDefaultQuarantineSizeMb;
}
if (!f->replace_str && common_flags()->intercept_strlen) {
Report("WARNING: strlen interceptor is enabled even though replace_str=0. "
"Use intercept_strlen=0 to disable it.");
}
}

} // namespace __asan
Expand Down
18 changes: 0 additions & 18 deletions compiler-rt/lib/asan/asan_interceptors.cc
Expand Up @@ -580,23 +580,6 @@ INTERCEPTOR(char*, strdup, const char *s) {
}
#endif

INTERCEPTOR(SIZE_T, strlen, const char *s) {
void *ctx;
ASAN_INTERCEPTOR_ENTER(ctx, strlen);
if (UNLIKELY(!asan_inited)) return internal_strlen(s);
// strlen is called from malloc_default_purgeable_zone()
// in __asan::ReplaceSystemAlloc() on Mac.
if (asan_init_is_running) {
return REAL(strlen)(s);
}
ENSURE_ASAN_INITED();
SIZE_T length = REAL(strlen)(s);
if (flags()->replace_str) {
ASAN_READ_RANGE(ctx, s, length + 1);
}
return length;
}

INTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) {
void *ctx;
ASAN_INTERCEPTOR_ENTER(ctx, wcslen);
Expand Down Expand Up @@ -763,7 +746,6 @@ void InitializeAsanInterceptors() {
ASAN_INTERCEPT_FUNC(strcat); // NOLINT
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);
Expand Down
12 changes: 2 additions & 10 deletions compiler-rt/lib/msan/msan_interceptors.cc
Expand Up @@ -43,6 +43,8 @@ using __sanitizer::atomic_load;
using __sanitizer::atomic_store;
using __sanitizer::atomic_uintptr_t;

DECLARE_REAL(SIZE_T, strlen, const char *s)

#if SANITIZER_FREEBSD
#define __errno_location __error
#endif
Expand Down Expand Up @@ -280,15 +282,6 @@ INTERCEPTOR(void, malloc_stats, void) {
#define MSAN_MAYBE_INTERCEPT_MALLOC_STATS
#endif

INTERCEPTOR(SIZE_T, strlen, const char *s) {
if (msan_init_is_running)
return REAL(strlen)(s);
ENSURE_MSAN_INITED();
SIZE_T res = REAL(strlen)(s);
CHECK_UNPOISONED(s, res + 1);
return res;
}

INTERCEPTOR(SIZE_T, strnlen, const char *s, SIZE_T n) {
ENSURE_MSAN_INITED();
SIZE_T res = REAL(strnlen)(s, n);
Expand Down Expand Up @@ -1562,7 +1555,6 @@ void InitializeInterceptors() {
INTERCEPT_FUNCTION(strndup);
MSAN_MAYBE_INTERCEPT___STRNDUP;
INTERCEPT_FUNCTION(strncpy); // NOLINT
INTERCEPT_FUNCTION(strlen);
INTERCEPT_FUNCTION(strnlen);
INTERCEPT_FUNCTION(gcvt);
INTERCEPT_FUNCTION(strcat); // NOLINT
Expand Down
Expand Up @@ -11,7 +11,7 @@
// ThreadSanitizer, MemorySanitizer, etc.
//
// This file should be included into the tool's interceptor file,
// which has to define it's own macros:
// which has to define its own macros:
// COMMON_INTERCEPTOR_ENTER
// COMMON_INTERCEPTOR_ENTER_NOIGNORE
// COMMON_INTERCEPTOR_READ_RANGE
Expand Down Expand Up @@ -200,6 +200,20 @@ UNUSED static void DeleteInterceptorMetadata(void *addr) {
}
#endif // SI_NOT_WINDOWS

#if SANITIZER_INTERCEPT_STRLEN
INTERCEPTOR(SIZE_T, strlen, const char *s) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, strlen, s);
SIZE_T result = REAL(strlen)(s);
if (common_flags()->intercept_strlen)
COMMON_INTERCEPTOR_READ_RANGE(ctx, s, result + 1);
return result;
}
#define INIT_STRLEN COMMON_INTERCEPT_FUNCTION(strlen)
#else
#define INIT_STRLEN
#endif

#if SANITIZER_INTERCEPT_TEXTDOMAIN
INTERCEPTOR(char*, textdomain, const char *domainname) {
void *ctx;
Expand Down Expand Up @@ -5376,6 +5390,7 @@ static void InitializeCommonInterceptors() {
interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();

INIT_TEXTDOMAIN;
INIT_STRLEN;
INIT_STRCMP;
INIT_STRNCMP;
INIT_STRCASECMP;
Expand Down
3 changes: 3 additions & 0 deletions compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
Expand Up @@ -182,6 +182,9 @@ COMMON_FLAG(bool, intercept_strspn, true,
COMMON_FLAG(bool, intercept_strpbrk, true,
"If set, uses custom wrappers for strpbrk function "
"to find more errors.")
COMMON_FLAG(bool, intercept_strlen, true,
"If set, uses custom wrappers for strlen function "
"to find more errors.")
COMMON_FLAG(bool, intercept_memcmp, true,
"If set, uses custom wrappers for memcmp function "
"to find more errors.")
Expand Down
Expand Up @@ -53,6 +53,7 @@
# define SI_IOS 0
#endif

#define SANITIZER_INTERCEPT_STRLEN 1
#define SANITIZER_INTERCEPT_STRCMP 1
#define SANITIZER_INTERCEPT_STRSTR 1
#define SANITIZER_INTERCEPT_STRCASESTR SI_NOT_WINDOWS
Expand Down
8 changes: 0 additions & 8 deletions compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
Expand Up @@ -668,13 +668,6 @@ TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {
}
#endif

TSAN_INTERCEPTOR(uptr, strlen, const char *s) {
SCOPED_TSAN_INTERCEPTOR(strlen, s);
uptr len = internal_strlen(s);
MemoryAccessRange(thr, pc, (uptr)s, len + 1, false);
return len;
}

TSAN_INTERCEPTOR(void*, memset, void *dst, int v, uptr size) {
// On FreeBSD we get here from libthr internals on thread initialization.
if (!COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED) {
Expand Down Expand Up @@ -2618,7 +2611,6 @@ void InitializeInterceptors() {
TSAN_MAYBE_INTERCEPT_PVALLOC;
TSAN_INTERCEPT(posix_memalign);

TSAN_INTERCEPT(strlen);
TSAN_INTERCEPT(memset);
TSAN_INTERCEPT(memcpy);
TSAN_INTERCEPT(memmove);
Expand Down

0 comments on commit ed3d347

Please sign in to comment.