1//===-- sanitizer_block_signals.cpp ---------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of sanitizer_common unit tests.
10//
11//===----------------------------------------------------------------------===//
12#include <signal.h>
13#include <stdio.h>
14
15#include "gtest/gtest.h"
16#include "sanitizer_common/sanitizer_linux.h"
17
18namespace __sanitizer {
19
20#if SANITIZER_LINUX && !SANITIZER_ANDROID
21volatile int received_sig = -1;
22
23void signal_handler(int signum) { received_sig = signum; }
24
25TEST(SanitizerCommon, NoBlockSignals) {
26 // No signals blocked
27 signal(SIGUSR1, signal_handler);
28 raise(SIGUSR1);
29 EXPECT_EQ(received_sig, SIGUSR1);
30
31 received_sig = -1;
32 signal(SIGPIPE, signal_handler);
33 raise(SIGPIPE);
34 EXPECT_EQ(received_sig, SIGPIPE);
35}
36
37TEST(SanitizerCommon, BlockSignalsPlain) {
38 // ScopedBlockSignals; SIGUSR1 should be blocked but not SIGPIPE
39 {
40 __sanitizer_sigset_t sigset = {};
41 ScopedBlockSignals block(&sigset);
42
43 received_sig = -1;
44 signal(SIGUSR1, signal_handler);
45 raise(SIGUSR1);
46 EXPECT_EQ(received_sig, -1);
47
48 received_sig = -1;
49 signal(SIGPIPE, signal_handler);
50 raise(SIGPIPE);
51 EXPECT_EQ(received_sig, SIGPIPE);
52 }
53 EXPECT_EQ(received_sig, SIGUSR1);
54}
55
56TEST(SanitizerCommon, BlockSignalsExceptPipe) {
57 // Manually block SIGPIPE; ScopedBlockSignals should not unblock this
58 sigset_t block_sigset;
59 sigemptyset(set: &block_sigset);
60 sigaddset(set: &block_sigset, SIGPIPE);
61 sigprocmask(SIG_BLOCK, set: &block_sigset, NULL);
62 {
63 __sanitizer_sigset_t sigset = {};
64 ScopedBlockSignals block(&sigset);
65
66 received_sig = -1;
67 signal(SIGPIPE, handler: signal_handler);
68 raise(SIGPIPE);
69 EXPECT_EQ(received_sig, -1);
70 }
71 sigprocmask(SIG_UNBLOCK, set: &block_sigset, NULL);
72 EXPECT_EQ(received_sig, SIGPIPE);
73}
74#endif // SANITIZER_LINUX && !SANITIZER_ANDROID
75
76} // namespace __sanitizer
77

source code of compiler-rt/lib/sanitizer_common/tests/sanitizer_block_signals.cpp