Date: Thu, 21 Oct 2004 06:54:12 GMT From: Mark Andrews <marka@daemon.lab.isc.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: threads/72953: fork() unblocks blocked signals w/o PTHREAD_SCOPE_SYSTEM Message-ID: <200410210654.i9L6sCjk029637@daemon.lab.isc.org> Resent-Message-ID: <200410210700.i9L70i4x004725@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 72953
>Category: threads
>Synopsis: fork() unblocks blocked signals w/o PTHREAD_SCOPE_SYSTEM
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-threads
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Oct 21 07:00:44 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator: Mark Andrews
>Release: FreeBSD 5.3-BETA6 i386
>Organization:
ISC
>Environment:
System: FreeBSD daemon.lab.isc.org 5.3-BETA6 FreeBSD 5.3-BETA6 #16: Tue Oct 5 23:37:23 UTC 2004 jinmei@daemon.lab.isc.org:/hog0/users/jinmei/src/sys/i386/compile/DAEMON i386
>Description:
fork() clears blocked signals unless PTHREAD_SCOPE_SYSTEM is set.
>How-To-Repeat:
Run the following program with and without the arguement system.
In the first case the program will incorrectly be killed by the
SIGTERM. In the second case the signal will be blocked and
sigwait returns.
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
sigset_t signal_mask;
void
dofork() {
switch (fork()) {
case 0:
break;
case -1:
_exit(1);
default:
_exit(0);
}
fprintf(stderr, "fork\n");
fflush(stderr);
}
static void *
waiter(void *arg) {
int result;
int sig;
result = sigwait(&signal_mask, &sig);
if (result != 0)
fprintf(stderr, "sigwait: %\n", strerror(result));
else
fprintf(stderr, "signal %d\n", sig);
fflush(stderr);
return (NULL);
}
int
main(int argc, char **argv) {
pthread_t id;
pthread_attr_t attr;
int result;
int scope = 0;
if (argc > 1) {
if (strcmp(argv[1], "system") == 0)
scope = 1;
}
sigemptyset (&signal_mask);
sigaddset (&signal_mask, SIGTERM);
result = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);
if (result != 0)
fprintf(stderr, "pthread_sigmask: %\n", strerror(result));
else
fprintf(stderr, "pthread_sigmask: OK\n");
fflush(stderr);
dofork();
result = pthread_attr_init(&attr);
if (result != 0)
fprintf(stderr, "pthread_attr_init: %\n", strerror(result));
else
fprintf(stderr, "pthread_attr_init: OK\n");
fflush(stderr);
if (scope) {
result = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
if (result != 0)
fprintf(stderr, "pthread_attr_setscope: %\n",
strerror(result));
else
fprintf(stderr, "pthread_attr_setscope: OK\n");
} else
fprintf(stderr, "default scope\n");
fflush(stderr);
result = pthread_create (&id, &attr, waiter, NULL);
if (result != 0)
fprintf(stderr, "pthread_create: %\n", strerror(result));
else
fprintf(stderr, "pthread_create: OK\n");
fflush(stderr);
if (kill(getpid(), SIGTERM) == -1)
perror("kill");
else
fprintf(stderr, "kill: OK\n");
fflush(stderr);
result = pthread_join(id, NULL);
if (result != 0)
fprintf(stderr, "pthread_join: %\n", strerror(result));
else
fprintf(stderr, "pthread_join: OK\n");
fflush(stderr);
return(0);
}
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200410210654.i9L6sCjk029637>
