@@ -842,6 +842,26 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
842
842
#endif
843
843
}
844
844
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
+
845
865
void internal_sigfillset (__sanitizer_sigset_t *set) {
846
866
internal_memset (set, 0xff , sizeof (*set));
847
867
}
@@ -1741,18 +1761,9 @@ HandleSignalMode GetHandleSignalMode(int signum) {
1741
1761
#if !SANITIZER_GO
1742
1762
void *internal_start_thread (void *(*func)(void *arg), void *arg) {
1743
1763
// 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 );
1753
1765
void *th;
1754
1766
real_pthread_create (&th, nullptr , func, arg);
1755
- internal_sigprocmask (SIG_SETMASK, &old, nullptr );
1756
1767
return th;
1757
1768
}
1758
1769
0 commit comments