[ASan] intercept swapcontext on Linux only

llvm-svn: 168509
This commit is contained in:
Alexey Samsonov 2012-11-23 10:14:44 +00:00
parent 0d7755ccb5
commit aac36b345a
4 changed files with 28 additions and 21 deletions

View File

@ -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

View File

@ -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__

View File

@ -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.

View File

@ -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;