~mdw
/
secnet
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
process: Clear SHUTDOWN hooks in afterfork()
[secnet]
/
process.c
diff --git
a/process.c
b/process.c
index
b75b9c0
..
77fe38e
100644
(file)
--- a/
process.c
+++ b/
process.c
@@
-35,8
+35,6
@@
static struct signotify *sigs=NULL;
static int spw,spr; /* file descriptors for signal notification pipe */
static int spw,spr; /* file descriptors for signal notification pipe */
-static void set_default_signals(void);
-
/* Long-lived subprocesses can only be started once we've started
signal processing so that we can catch SIGCHLD for them and report
their exit status using the callback function. We block SIGCHLD
/* Long-lived subprocesses can only be started once we've started
signal processing so that we can catch SIGCHLD for them and report
their exit status using the callback function. We block SIGCHLD
@@
-58,8
+56,7
@@
pid_t makesubproc(process_entry_fn *entry, process_callback_fn *cb,
p=fork();
if (p==0) {
/* Child process */
p=fork();
if (p==0) {
/* Child process */
- set_default_signals();
- sigprocmask(SIG_SETMASK,&emptyset,NULL);
+ afterfork();
entry(est);
abort();
} else if (p==-1) {
entry(est);
abort();
} else if (p==-1) {
@@
-155,6
+152,7
@@
int sys_cmd(const char *path, const char *arg, ...)
if the execvp() fails this seems somewhat pointless, and
increases the chance of the child process failing before it
gets to exec(). */
if the execvp() fails this seems somewhat pointless, and
increases the chance of the child process failing before it
gets to exec(). */
+ afterfork();
va_start(ap,arg);
args[0]=(char *)arg; /* program name */
i=1;
va_start(ap,arg);
args[0]=(char *)arg; /* program name */
i=1;
@@
-214,12
+212,16
@@
static void signal_afterpoll(void *st, struct pollfd *fds, int nfds)
}
}
}
}
-
static void set_default_signals
(void)
+
void afterfork
(void)
{
struct signotify *n;
sigset_t done;
struct sigaction sa;
{
struct signotify *n;
sigset_t done;
struct sigaction sa;
+ clear_phase_hooks(PHASE_SHUTDOWN);
+ /* Prevents calls to fatal() etc. in the child from running off
+ and doing a lot of unhelpful things */
+
sigemptyset(&done);
for (n=sigs; n; n=n->next)
if (!sigismember(&done,n->signum)) {
sigemptyset(&done);
for (n=sigs; n; n=n->next)
if (!sigismember(&done,n->signum)) {
@@
-229,6
+231,9
@@
static void set_default_signals(void)
sa.sa_flags=0;
sigaction(n->signum,&sa,NULL);
}
sa.sa_flags=0;
sigaction(n->signum,&sa,NULL);
}
+
+ sigemptyset(&emptyset);
+ sigprocmask(SIG_SETMASK,&emptyset,NULL);
}
static void signal_handler(int signum)
}
static void signal_handler(int signum)
@@
-300,9
+305,8
@@
void start_signal_handling(void)
pipe_cloexec(p);
spw=p[1];
spr=p[0];
pipe_cloexec(p);
spw=p[1];
spr=p[0];
- if (fcntl(spw, F_SETFL, fcntl(spw, F_GETFL)|O_NONBLOCK)==-1) {
- fatal_perror("start_signal_handling: fcntl(O_NONBLOCK)");
- }
+ setnonblock(spw);
+ setnonblock(spr);
register_for_poll(NULL,signal_beforepoll,signal_afterpoll,"signal");
signal_handling=True;
register_for_poll(NULL,signal_beforepoll,signal_afterpoll,"signal");
signal_handling=True;