forked from OSchip/llvm-project
[NFC][sanitizer] Extract ScopedBlockSignals
Differential Revision: https://reviews.llvm.org/D113452
This commit is contained in:
parent
d1a688ce0e
commit
84b8dc710c
|
@ -842,6 +842,26 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
|
|||
#endif
|
||||
}
|
||||
|
||||
void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *old) {
|
||||
CHECK_EQ(0, internal_sigprocmask(SIG_SETMASK, set, old));
|
||||
}
|
||||
|
||||
ScopedBlockSignals::ScopedBlockSignals(__sanitizer_sigset_t *copy) {
|
||||
__sanitizer_sigset_t set;
|
||||
internal_sigfillset(&set);
|
||||
# if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
// Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
|
||||
// on any thread, setuid call hangs.
|
||||
// See test/sanitizer_common/TestCases/Linux/setuid.c.
|
||||
internal_sigdelset(&set, 33);
|
||||
# endif
|
||||
SetSigProcMask(&set, &saved_);
|
||||
if (copy)
|
||||
internal_memcpy(copy, &saved_, sizeof(saved_));
|
||||
}
|
||||
|
||||
ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
|
||||
|
||||
void internal_sigfillset(__sanitizer_sigset_t *set) {
|
||||
internal_memset(set, 0xff, sizeof(*set));
|
||||
}
|
||||
|
@ -1741,18 +1761,9 @@ HandleSignalMode GetHandleSignalMode(int signum) {
|
|||
#if !SANITIZER_GO
|
||||
void *internal_start_thread(void *(*func)(void *arg), void *arg) {
|
||||
// Start the thread with signals blocked, otherwise it can steal user signals.
|
||||
__sanitizer_sigset_t set, old;
|
||||
internal_sigfillset(&set);
|
||||
#if SANITIZER_LINUX && !SANITIZER_ANDROID
|
||||
// Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
|
||||
// on any thread, setuid call hangs.
|
||||
// See test/sanitizer_common/TestCases/Linux/setuid.c.
|
||||
internal_sigdelset(&set, 33);
|
||||
#endif
|
||||
internal_sigprocmask(SIG_SETMASK, &set, &old);
|
||||
ScopedBlockSignals block(nullptr);
|
||||
void *th;
|
||||
real_pthread_create(&th, nullptr, func, arg);
|
||||
internal_sigprocmask(SIG_SETMASK, &old, nullptr);
|
||||
return th;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,17 @@ uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
|
|||
uptr internal_sigaltstack(const void* ss, void* oss);
|
||||
uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
|
||||
__sanitizer_sigset_t *oldset);
|
||||
#if SANITIZER_GLIBC
|
||||
|
||||
void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *oldset);
|
||||
struct ScopedBlockSignals {
|
||||
explicit ScopedBlockSignals(__sanitizer_sigset_t *copy);
|
||||
~ScopedBlockSignals();
|
||||
|
||||
private:
|
||||
__sanitizer_sigset_t saved_;
|
||||
};
|
||||
|
||||
# if SANITIZER_GLIBC
|
||||
uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue