Skip to content

Commit 84b8dc7

Browse files
committed
[NFC][sanitizer] Extract ScopedBlockSignals
Differential Revision: https://reviews.llvm.org/D113452
1 parent d1a688c commit 84b8dc7

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,26 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
842842
#endif
843843
}
844844

845+
void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *old) {
846+
CHECK_EQ(0, internal_sigprocmask(SIG_SETMASK, set, old));
847+
}
848+
849+
ScopedBlockSignals::ScopedBlockSignals(__sanitizer_sigset_t *copy) {
850+
__sanitizer_sigset_t set;
851+
internal_sigfillset(&set);
852+
# if SANITIZER_LINUX && !SANITIZER_ANDROID
853+
// Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
854+
// on any thread, setuid call hangs.
855+
// See test/sanitizer_common/TestCases/Linux/setuid.c.
856+
internal_sigdelset(&set, 33);
857+
# endif
858+
SetSigProcMask(&set, &saved_);
859+
if (copy)
860+
internal_memcpy(copy, &saved_, sizeof(saved_));
861+
}
862+
863+
ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
864+
845865
void internal_sigfillset(__sanitizer_sigset_t *set) {
846866
internal_memset(set, 0xff, sizeof(*set));
847867
}
@@ -1741,18 +1761,9 @@ HandleSignalMode GetHandleSignalMode(int signum) {
17411761
#if !SANITIZER_GO
17421762
void *internal_start_thread(void *(*func)(void *arg), void *arg) {
17431763
// Start the thread with signals blocked, otherwise it can steal user signals.
1744-
__sanitizer_sigset_t set, old;
1745-
internal_sigfillset(&set);
1746-
#if SANITIZER_LINUX && !SANITIZER_ANDROID
1747-
// Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
1748-
// on any thread, setuid call hangs.
1749-
// See test/sanitizer_common/TestCases/Linux/setuid.c.
1750-
internal_sigdelset(&set, 33);
1751-
#endif
1752-
internal_sigprocmask(SIG_SETMASK, &set, &old);
1764+
ScopedBlockSignals block(nullptr);
17531765
void *th;
17541766
real_pthread_create(&th, nullptr, func, arg);
1755-
internal_sigprocmask(SIG_SETMASK, &old, nullptr);
17561767
return th;
17571768
}
17581769

compiler-rt/lib/sanitizer_common/sanitizer_linux.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,17 @@ uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
4949
uptr internal_sigaltstack(const void* ss, void* oss);
5050
uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
5151
__sanitizer_sigset_t *oldset);
52-
#if SANITIZER_GLIBC
52+
53+
void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *oldset);
54+
struct ScopedBlockSignals {
55+
explicit ScopedBlockSignals(__sanitizer_sigset_t *copy);
56+
~ScopedBlockSignals();
57+
58+
private:
59+
__sanitizer_sigset_t saved_;
60+
};
61+
62+
# if SANITIZER_GLIBC
5363
uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
5464
#endif
5565

0 commit comments

Comments
 (0)