diff options
author | hunt <hunt> | 2006-06-13 21:48:20 +0000 |
---|---|---|
committer | hunt <hunt> | 2006-06-13 21:48:20 +0000 |
commit | bcbf42ee21fbace1d45c4b0b8d4145d8097eeb25 (patch) | |
tree | 76f83ec5efb4a9a33e9428547a82439b84b8dcda /runtime/stpd/librelay.c | |
parent | 58dd896433eca417b237f6f17cd2194cc59a4fb3 (diff) | |
download | systemtap-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.c | 26 |
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; } |