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