summaryrefslogtreecommitdiff
path: root/lib/msan
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2017-11-09 22:52:15 +0000
committerVitaly Buka <vitalybuka@google.com>2017-11-09 22:52:15 +0000
commit5918d76dac698e4f583e49b8d338de8a2d700a47 (patch)
tree6487cf131b165107a78d8fe784197c2a83da018d /lib/msan
parent4fa4ebc62392de210e22dc5064699957676c4c8f (diff)
[msan] Extract signal_impl and sigaction_impl
Summary: Preparation for using interceptor from sanitizer_common. Reviewers: eugenis Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D39824 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@317844 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan')
-rw-r--r--lib/msan/msan_interceptors.cc22
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc
index 72bb7455d..09634c6ee 100644
--- a/lib/msan/msan_interceptors.cc
+++ b/lib/msan/msan_interceptors.cc
@@ -1006,8 +1006,22 @@ static void read_sigaction(const __sanitizer_sigaction *act) {
CHECK_UNPOISONED(&act->sa_mask, sizeof(act->sa_mask));
}
+static int sigaction_impl(int signo, const __sanitizer_sigaction *act,
+ __sanitizer_sigaction *oldact);
+static uptr signal_impl(int signo, uptr cb);
+
INTERCEPTOR(int, sigaction, int signo, const __sanitizer_sigaction *act,
__sanitizer_sigaction *oldact) {
+ return sigaction_impl(signo, act, oldact);
+}
+
+INTERCEPTOR(int, signal, int signo, uptr cb) {
+ cb = signal_impl(signo, cb);
+ return REAL(signal)(signo, cb);
+}
+
+static int sigaction_impl(int signo, const __sanitizer_sigaction *act,
+ __sanitizer_sigaction *oldact) {
ENSURE_MSAN_INITED();
if (act) read_sigaction(act);
int res;
@@ -1045,19 +1059,17 @@ INTERCEPTOR(int, sigaction, int signo, const __sanitizer_sigaction *act,
return res;
}
-INTERCEPTOR(int, signal, int signo, uptr cb) {
+static uptr signal_impl(int signo, uptr cb) {
ENSURE_MSAN_INITED();
if (flags()->wrap_signals) {
CHECK_LT(signo, kMaxSignals);
SpinMutexLock lock(&sigactions_mu);
if (cb != __sanitizer::sig_ign && cb != __sanitizer::sig_dfl) {
atomic_store(&sigactions[signo], cb, memory_order_relaxed);
- cb = (uptr) SignalHandler;
+ cb = (uptr)&SignalHandler;
}
- return REAL(signal)(signo, cb);
- } else {
- return REAL(signal)(signo, cb);
}
+ return cb;
}
extern "C" int pthread_attr_init(void *attr);