Skip to content

Commit 7734825

Browse files
committed
Update to 19.1.4
1 parent b9636eb commit 7734825

File tree

2 files changed

+48
-20
lines changed

2 files changed

+48
-20
lines changed

system/lib/compiler-rt/lib/builtins/int_math.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,12 @@
6565
#define crt_copysign(x, y) __builtin_copysign((x), (y))
6666
#define crt_copysignf(x, y) __builtin_copysignf((x), (y))
6767
#define crt_copysignl(x, y) __builtin_copysignl((x), (y))
68-
#if __has_builtin(__builtin_copysignf128)
68+
// We define __has_builtin to always return 0 for GCC versions below 10,
69+
// but __builtin_copysignf128 is available since version 7.
70+
#if __has_builtin(__builtin_copysignf128) || \
71+
(defined(__GNUC__) && __GNUC__ >= 7)
6972
#define crt_copysignf128(x, y) __builtin_copysignf128((x), (y))
70-
#elif __has_builtin(__builtin_copysignq) || (defined(__GNUC__) && __GNUC__ >= 7)
73+
#elif __has_builtin(__builtin_copysignq)
7174
#define crt_copysignf128(x, y) __builtin_copysignq((x), (y))
7275
#endif
7376
#endif
@@ -80,9 +83,11 @@
8083
#define crt_fabs(x) __builtin_fabs((x))
8184
#define crt_fabsf(x) __builtin_fabsf((x))
8285
#define crt_fabsl(x) __builtin_fabsl((x))
83-
#if __has_builtin(__builtin_fabsf128)
86+
// We define __has_builtin to always return 0 for GCC versions below 10,
87+
// but __builtin_fabsf128 is available since version 7.
88+
#if __has_builtin(__builtin_fabsf128) || (defined(__GNUC__) && __GNUC__ >= 7)
8489
#define crt_fabsf128(x) __builtin_fabsf128((x))
85-
#elif __has_builtin(__builtin_fabsq) || (defined(__GNUC__) && __GNUC__ >= 7)
90+
#elif __has_builtin(__builtin_fabsq)
8691
#define crt_fabsf128(x) __builtin_fabsq((x))
8792
#endif
8893
#endif

system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -172,33 +172,56 @@ void SetSigProcMask(__sanitizer_sigset_t *set, __sanitizer_sigset_t *oldset) {
172172
CHECK_EQ(0, internal_sigprocmask(SIG_SETMASK, set, oldset));
173173
}
174174

175+
# if SANITIZER_LINUX
176+
// Deletes the specified signal from newset, if it is not present in oldset
177+
// Equivalently: newset[signum] = newset[signum] & oldset[signum]
178+
static void KeepUnblocked(__sanitizer_sigset_t &newset,
179+
__sanitizer_sigset_t &oldset, int signum) {
180+
// FIXME: https://github.com/google/sanitizers/issues/1816
181+
if (SANITIZER_ANDROID || !internal_sigismember(&oldset, signum))
182+
internal_sigdelset(&newset, signum);
183+
}
184+
# endif
185+
175186
// Block asynchronous signals
176187
void BlockSignals(__sanitizer_sigset_t *oldset) {
177-
__sanitizer_sigset_t set;
178-
internal_sigfillset(&set);
179-
# if SANITIZER_LINUX && !SANITIZER_ANDROID
188+
__sanitizer_sigset_t newset;
189+
internal_sigfillset(&newset);
190+
191+
# if SANITIZER_LINUX
192+
__sanitizer_sigset_t currentset;
193+
194+
# if !SANITIZER_ANDROID
195+
// FIXME: https://github.com/google/sanitizers/issues/1816
196+
SetSigProcMask(NULL, &currentset);
197+
180198
// Glibc uses SIGSETXID signal during setuid call. If this signal is blocked
181199
// on any thread, setuid call hangs.
182200
// See test/sanitizer_common/TestCases/Linux/setuid.c.
183-
internal_sigdelset(&set, 33);
184-
# endif
185-
# if SANITIZER_LINUX
201+
KeepUnblocked(newset, currentset, 33);
202+
# endif // !SANITIZER_ANDROID
203+
186204
// Seccomp-BPF-sandboxed processes rely on SIGSYS to handle trapped syscalls.
187205
// If this signal is blocked, such calls cannot be handled and the process may
188206
// hang.
189-
internal_sigdelset(&set, 31);
207+
KeepUnblocked(newset, currentset, 31);
190208

209+
# if !SANITIZER_ANDROID
191210
// Don't block synchronous signals
192-
internal_sigdelset(&set, SIGSEGV);
193-
internal_sigdelset(&set, SIGBUS);
194-
internal_sigdelset(&set, SIGILL);
195-
internal_sigdelset(&set, SIGTRAP);
196-
internal_sigdelset(&set, SIGABRT);
197-
internal_sigdelset(&set, SIGFPE);
198-
internal_sigdelset(&set, SIGPIPE);
199-
# endif
211+
// but also don't unblock signals that the user had deliberately blocked.
212+
// FIXME: https://github.com/google/sanitizers/issues/1816
213+
KeepUnblocked(newset, currentset, SIGSEGV);
214+
KeepUnblocked(newset, currentset, SIGBUS);
215+
KeepUnblocked(newset, currentset, SIGILL);
216+
KeepUnblocked(newset, currentset, SIGTRAP);
217+
KeepUnblocked(newset, currentset, SIGABRT);
218+
KeepUnblocked(newset, currentset, SIGFPE);
219+
KeepUnblocked(newset, currentset, SIGPIPE);
220+
# endif //! SANITIZER_ANDROID
221+
222+
# endif // SANITIZER_LINUX
200223

201-
SetSigProcMask(&set, oldset);
224+
SetSigProcMask(&newset, oldset);
202225
}
203226

204227
ScopedBlockSignals::ScopedBlockSignals(__sanitizer_sigset_t *copy) {

0 commit comments

Comments
 (0)