summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/msan/msan_interceptors.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/msan/msan_interceptors.cc')
-rw-r--r--compiler-rt/lib/msan/msan_interceptors.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc
index eb6888a3a8b..8d39e541895 100644
--- a/compiler-rt/lib/msan/msan_interceptors.cc
+++ b/compiler-rt/lib/msan/msan_interceptors.cc
@@ -911,17 +911,20 @@ static atomic_uintptr_t sigactions[kMaxSignals];
static StaticSpinMutex sigactions_mu;
static void SignalHandler(int signo) {
+ ScopedThreadLocalStateBackup stlsb;
+ stlsb.Backup();
UnpoisonParam(1);
typedef void (*signal_cb)(int x);
signal_cb cb =
(signal_cb)atomic_load(&sigactions[signo], memory_order_relaxed);
cb(signo);
-
- UnpoisonThreadLocalState();
+ stlsb.Restore();
}
static void SignalAction(int signo, void *si, void *uc) {
+ ScopedThreadLocalStateBackup stlsb;
+ stlsb.Backup();
UnpoisonParam(3);
__msan_unpoison(si, sizeof(__sanitizer_sigaction));
__msan_unpoison(uc, __sanitizer::ucontext_t_sz);
@@ -930,8 +933,7 @@ static void SignalAction(int signo, void *si, void *uc) {
sigaction_cb cb =
(sigaction_cb)atomic_load(&sigactions[signo], memory_order_relaxed);
cb(signo, si, uc);
-
- UnpoisonThreadLocalState();
+ stlsb.Restore();
}
INTERCEPTOR(int, sigaction, int signo, const __sanitizer_sigaction *act,
OpenPOWER on IntegriCloud