77 lines · cpp
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-exception6//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_ANDROID21volatile int received_sig = -1;22 23void signal_handler(int signum) { received_sig = signum; }24 25TEST(SanitizerCommon, NoBlockSignals) {26 // No signals blocked27 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 SIGPIPE39 {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 this58 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_ANDROID75 76} // namespace __sanitizer77