[ASan] intercept swapcontext on Linux only
llvm-svn: 168509
This commit is contained in:
parent
0d7755ccb5
commit
aac36b345a
|
|
@ -51,14 +51,18 @@ using __sanitizer::uptr;
|
|||
# define ASAN_INTERCEPT_STRNLEN 0
|
||||
#endif
|
||||
|
||||
#if !defined(ANDROID) && !defined(_WIN32)
|
||||
# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 1
|
||||
#if defined(__linux__) && !defined(ANDROID)
|
||||
# define ASAN_INTERCEPT_SWAPCONTEXT 1
|
||||
#else
|
||||
# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 0
|
||||
# define ASAN_INTERCEPT_SWAPCONTEXT 0
|
||||
#endif
|
||||
|
||||
#if !defined(ANDROID) && !defined(_WIN32)
|
||||
# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 1
|
||||
#else
|
||||
# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 0
|
||||
#endif
|
||||
|
||||
// On Darwin siglongjmp tailcalls longjmp, so we don't want to intercept it
|
||||
// there.
|
||||
#if !defined(_WIN32) && (!defined(__APPLE__) || MAC_INTERPOSE_FUNCTIONS)
|
||||
|
|
@ -90,12 +94,6 @@ DECLARE_FUNCTION_AND_WRAPPER(int, sigaction, int sig,
|
|||
DECLARE_FUNCTION_AND_WRAPPER(void*, signal, int signum, void *handler);
|
||||
# endif
|
||||
|
||||
// ucontext.h
|
||||
# if ASAN_INTERCEPT_SWAPCONTEXT
|
||||
DECLARE_FUNCTION_AND_WRAPPER(int, swapcontext, struct ucontext_t *oucp,
|
||||
struct ucontext_t *ucp);
|
||||
# endif
|
||||
|
||||
// setjmp.h
|
||||
DECLARE_FUNCTION_AND_WRAPPER(void, longjmp, void *env, int value);
|
||||
# if ASAN_INTERCEPT__LONGJMP
|
||||
|
|
|
|||
|
|
@ -170,6 +170,23 @@ void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp) {
|
|||
}
|
||||
}
|
||||
|
||||
#if !ASAN_ANDROID
|
||||
void ClearShadowMemoryForContext(void *context) {
|
||||
ucontext_t *ucp = (ucontext_t*)context;
|
||||
uptr sp = (uptr)ucp->uc_stack.ss_sp;
|
||||
uptr size = ucp->uc_stack.ss_size;
|
||||
// Align to page size.
|
||||
uptr bottom = sp & ~(kPageSize - 1);
|
||||
size += sp - bottom;
|
||||
size = RoundUpTo(size, kPageSize);
|
||||
PoisonShadow(bottom, size, 0);
|
||||
}
|
||||
#else
|
||||
void ClearShadowMemoryForContext(void *context) {
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace __asan
|
||||
|
||||
#endif // __linux__
|
||||
|
|
|
|||
|
|
@ -171,6 +171,10 @@ void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp) {
|
|||
}
|
||||
}
|
||||
|
||||
void ClearShadowMemoryForContext(void *context) {
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
// The range of pages to be used for escape islands.
|
||||
// TODO(glider): instead of mapping a fixed range we must find a range of
|
||||
// unmapped pages in vmmap and take them.
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <ucontext.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough.
|
||||
|
|
@ -96,17 +95,6 @@ void InstallSignalHandlers() {
|
|||
MaybeInstallSigaction(SIGBUS, ASAN_OnSIGSEGV);
|
||||
}
|
||||
|
||||
void ClearShadowMemoryForContext(void *context) {
|
||||
ucontext_t *ucp = (ucontext_t*)context;
|
||||
uptr sp = (uptr)ucp->uc_stack.ss_sp;
|
||||
uptr size = ucp->uc_stack.ss_size;
|
||||
// Align to page size.
|
||||
uptr bottom = sp & ~(kPageSize - 1);
|
||||
size += sp - bottom;
|
||||
size = RoundUpTo(size, kPageSize);
|
||||
PoisonShadow(bottom, size, 0);
|
||||
}
|
||||
|
||||
// ---------------------- TSD ---------------- {{{1
|
||||
|
||||
static pthread_key_t tsd_key;
|
||||
|
|
|
|||
Loading…
Reference in New Issue