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 18 namespace __sanitizer { 19 20 #if SANITIZER_LINUX && !SANITIZER_ANDROID 21 volatile int received_sig = -1; 22 23 void signal_handler(int signum) { received_sig = signum; } 24 25 TEST(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 37 TEST(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 56 TEST(SanitizerCommon, BlockSignalsExceptPipe) { 57 // Manually block SIGPIPE; ScopedBlockSignals should not unblock this 58 sigset_t block_sigset; 59 sigemptyset(&block_sigset); 60 sigaddset(&block_sigset, SIGPIPE); 61 sigprocmask(SIG_BLOCK, &block_sigset, NULL); 62 { 63 __sanitizer_sigset_t sigset = {}; 64 ScopedBlockSignals block(&sigset); 65 66 received_sig = -1; 67 signal(SIGPIPE, signal_handler); 68 raise(SIGPIPE); 69 EXPECT_EQ(received_sig, -1); 70 } 71 sigprocmask(SIG_UNBLOCK, &block_sigset, NULL); 72 EXPECT_EQ(received_sig, SIGPIPE); 73 } 74 #endif // SANITIZER_LINUX && !SANITIZER_ANDROID 75 76 } // namespace __sanitizer 77