diff options
Diffstat (limited to 'lib/esan')
-rw-r--r-- | lib/esan/esan.cpp | 3 | ||||
-rw-r--r-- | lib/esan/esan_interceptors.cpp | 6 | ||||
-rw-r--r-- | lib/esan/working_set.cpp | 5 | ||||
-rw-r--r-- | lib/esan/working_set.h | 1 |
4 files changed, 14 insertions, 1 deletions
diff --git a/lib/esan/esan.cpp b/lib/esan/esan.cpp index e7399e219..e6d6aff31 100644 --- a/lib/esan/esan.cpp +++ b/lib/esan/esan.cpp @@ -197,6 +197,9 @@ void initializeLibrary(ToolType Tool) { } initializeShadow(); + if (__esan_which_tool == ESAN_WorkingSet) + initializeShadowWorkingSet(); + initializeInterceptors(); if (__esan_which_tool == ESAN_CacheFrag) { diff --git a/lib/esan/esan_interceptors.cpp b/lib/esan/esan_interceptors.cpp index 5d4edb51d..7aefeb664 100644 --- a/lib/esan/esan_interceptors.cpp +++ b/lib/esan/esan_interceptors.cpp @@ -17,6 +17,7 @@ #include "interception/interception.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_libc.h" +#include "sanitizer_common/sanitizer_linux.h" #include "sanitizer_common/sanitizer_stacktrace.h" using namespace __esan; // NOLINT @@ -397,6 +398,11 @@ INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act, // This is required to properly use internal_sigaction. namespace __sanitizer { int real_sigaction(int signum, const void *act, void *oldact) { + if (REAL(sigaction) == nullptr) { + // With an instrumented allocator, this is called during interceptor init + // and we need a raw syscall solution. + return internal_sigaction_syscall(signum, act, oldact); + } return REAL(sigaction)(signum, (const struct sigaction *)act, (struct sigaction *)oldact); } diff --git a/lib/esan/working_set.cpp b/lib/esan/working_set.cpp index 9e7520f49..622fd29e8 100644 --- a/lib/esan/working_set.cpp +++ b/lib/esan/working_set.cpp @@ -182,10 +182,13 @@ static void takeSample(void *Arg) { } } -void initializeWorkingSet() { +// Initialization that must be done before any instrumented code is executed. +void initializeShadowWorkingSet() { CHECK(getFlags()->cache_line_size == CacheLineSize); registerMemoryFaultHandler(); +} +void initializeWorkingSet() { if (getFlags()->record_snapshots) { for (u32 i = 0; i < NumFreq; ++i) SizePerFreq[i].initialize(CircularBufferSizes[i]); diff --git a/lib/esan/working_set.h b/lib/esan/working_set.h index 3750a480a..034dfe6d9 100644 --- a/lib/esan/working_set.h +++ b/lib/esan/working_set.h @@ -21,6 +21,7 @@ namespace __esan { void initializeWorkingSet(); +void initializeShadowWorkingSet(); int finalizeWorkingSet(); void processRangeAccessWorkingSet(uptr PC, uptr Addr, SIZE_T Size, bool IsWrite); |