brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · b43648a Raw
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