#include <signal.h>
#include <stdio.h>
#include "gtest/gtest.h"
#include "sanitizer_common/sanitizer_linux.h"
namespace __sanitizer {
#if SANITIZER_LINUX && !SANITIZER_ANDROID
volatile int received_sig = -1;
void signal_handler(int signum) { received_sig = signum; }
TEST(SanitizerCommon, NoBlockSignals) {
signal(SIGUSR1, signal_handler);
raise(SIGUSR1);
EXPECT_EQ(received_sig, SIGUSR1);
received_sig = -1;
signal(SIGPIPE, signal_handler);
raise(SIGPIPE);
EXPECT_EQ(received_sig, SIGPIPE);
}
TEST(SanitizerCommon, BlockSignalsPlain) {
{
__sanitizer_sigset_t sigset = {};
ScopedBlockSignals block(&sigset);
received_sig = -1;
signal(SIGUSR1, signal_handler);
raise(SIGUSR1);
EXPECT_EQ(received_sig, -1);
received_sig = -1;
signal(SIGPIPE, signal_handler);
raise(SIGPIPE);
EXPECT_EQ(received_sig, SIGPIPE);
}
EXPECT_EQ(received_sig, SIGUSR1);
}
TEST(SanitizerCommon, BlockSignalsExceptPipe) {
sigset_t block_sigset;
sigemptyset(&block_sigset);
sigaddset(&block_sigset, SIGPIPE);
sigprocmask(SIG_BLOCK, &block_sigset, NULL);
{
__sanitizer_sigset_t sigset = {};
ScopedBlockSignals block(&sigset);
received_sig = -1;
signal(SIGPIPE, signal_handler);
raise(SIGPIPE);
EXPECT_EQ(received_sig, -1);
}
sigprocmask(SIG_UNBLOCK, &block_sigset, NULL);
EXPECT_EQ(received_sig, SIGPIPE);
}
#endif
}