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