Open
Description
Reproduction (ia32-generic-qemu):
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
volatile int sig_recvd;
void handler(int sig) {
sig_recvd = sig;
}
int main(void) {
sigset_t set;
struct sigaction sa;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGPIPE);
if (sigprocmask(SIG_SETMASK, &set, NULL) < 0) {
perror("sigprocmask");
exit(EXIT_FAILURE);
}
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGHUP, &sa, NULL) < 0 || sigaction(SIGPIPE, &sa, NULL) < 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
if (kill(getpid(), SIGHUP) < 0 || kill(getpid(), SIGPIPE) < 0) {
perror("kill");
exit(EXIT_FAILURE);
}
#if 1
if (kill(getpid(), SIGCHLD) < 0) {
perror("kill wtih sigchild");
exit(EXIT_FAILURE);
}
#endif
if (sig_recvd == SIGHUP && sig_recvd == SIGPIPE) {
printf("Error: Received on block\n");
exit(EXIT_FAILURE);
}
sig_recvd = 0;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGPIPE);
if (sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) {
perror("sigprocmask");
exit(EXIT_FAILURE);
}
if (sig_recvd != SIGHUP && sig_recvd != SIGPIPE) {
printf("Error: No signal after unblock\n");
exit(EXIT_FAILURE);
}
else {
printf("success\n");
exit(EXIT_SUCCESS);
}
return 0;
}