summaryrefslogtreecommitdiffstats
path: root/runtime/stpd/librelay.c
diff options
context:
space:
mode:
authorhunt <hunt>2006-06-13 21:48:20 +0000
committerhunt <hunt>2006-06-13 21:48:20 +0000
commitbcbf42ee21fbace1d45c4b0b8d4145d8097eeb25 (patch)
tree76f83ec5efb4a9a33e9428547a82439b84b8dcda /runtime/stpd/librelay.c
parent58dd896433eca417b237f6f17cd2194cc59a4fb3 (diff)
downloadsystemtap-steved-bcbf42ee21fbace1d45c4b0b8d4145d8097eeb25.tar.gz
systemtap-steved-bcbf42ee21fbace1d45c4b0b8d4145d8097eeb25.tar.xz
systemtap-steved-bcbf42ee21fbace1d45c4b0b8d4145d8097eeb25.zip
2006-06-13 Martin Hunt <hunt@redhat.com>
* librelay.c (start_cmd): Rewrite using sigwait() to eliminate a race.
Diffstat (limited to 'runtime/stpd/librelay.c')
-rw-r--r--runtime/stpd/librelay.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/runtime/stpd/librelay.c b/runtime/stpd/librelay.c
index 32ac5415..ae03c200 100644
--- a/runtime/stpd/librelay.c
+++ b/runtime/stpd/librelay.c
@@ -411,23 +411,22 @@ err:
return -1;
}
-static volatile sig_atomic_t got_signal;
-static sigset_t usrmask, nullmask, oldmask;
-
-static void sig_usr(int sig __attribute__((unused)))
-{
- got_signal = 1;
-}
-
void start_cmd(void)
{
pid_t pid;
+ sigset_t usrset;
+
+ sigemptyset(&usrset);
+ sigaddset(&usrset, SIGUSR1);
+ sigprocmask(SIG_BLOCK, &usrset, NULL);
dbug ("execing target_cmd %s\n", target_cmd);
if ((pid = fork()) < 0) {
perror ("fork");
exit(-1);
} else if (pid == 0) {
+ int signum;
+
if (setregid(cmd_gid, cmd_gid) < 0) {
perror("setregid");
}
@@ -435,19 +434,12 @@ void start_cmd(void)
perror("setreuid");
}
/* wait here until signaled */
- signal(SIGUSR1, sig_usr);
- sigemptyset(&nullmask);
- sigemptyset(&usrmask);
- sigaddset(&usrmask, SIGUSR1);
- sigprocmask(SIG_BLOCK, &usrmask, &oldmask);
- while (!got_signal)
- sigsuspend(&nullmask);
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ sigwait(&usrset, &signum);
+
if (execl("/bin/sh", "sh", "-c", target_cmd, NULL) < 0)
perror(target_cmd);
_exit(-1);
}
-
target_pid = pid;
}