]> granicus.if.org Git - cronie/commitdiff
Use fork instead of vfork.
authormmaslano <mmaslano@redhat.com>
Fri, 17 Aug 2007 12:52:22 +0000 (14:52 +0200)
committermmaslano <mmaslano@redhat.com>
Fri, 17 Aug 2007 12:52:22 +0000 (14:52 +0200)
    Add signal: Our grandparent is watching for our parent's death by
    catching SIGCHLD. Meanwhile, our parent will use wait
    explicitly and so has disabled SIGCHLD. So now it's
    time to reset SIGCHLD handling.

do_command.c
popen.c

index e24e0190611a60f480f2dee3744d2d47cd064c09..344991645aecc82072c90a6a744dcd8c58d2d857 100644 (file)
@@ -136,13 +136,13 @@ child_process(entry *e, user *u) {
 
        /* fork again, this time so we can exec the user's command.
         */
-       switch (vfork()) {
+       switch (fork()) {
        case -1:
-               log_it("CRON", getpid(), "error", "can't vfork");
+               log_it("CRON", getpid(), "error", "can't fork");
                exit(ERROR_EXIT);
                /*NOTREACHED*/
        case 0:
-               Debug(DPROC, ("[%ld] grandchild process vfork()'ed\n",
+               Debug(DPROC, ("[%ld] grandchild process fork()'ed\n",
                              (long)getpid()))
 
                /* write a log message.  we've waited this long to do it
@@ -187,6 +187,13 @@ child_process(entry *e, user *u) {
                }
                dup2(STDOUT, STDERR);
 
+               /* Our grandparent is watching for our parent's death by
+                * catching SIGCHLD. Meanwhile, our parent will use wait
+                * explicitly and so has disabled SIGCHLD. So now it's
+                * time to reset SIGCHLD handling.
+                */
+               (void) signal(SIGCHLD, SIG_DFL);
+
                /* set our directory, uid and gid.  Set gid first, since once
                 * we set uid, we've lost root privledges.
                 */
diff --git a/popen.c b/popen.c
index 8084b217ffad678ddd9bfd17d30b59c769dcc0b5..a37102dc6290a9abcb84feffebcc1ed4dda47cff 100644 (file)
--- a/popen.c
+++ b/popen.c
@@ -84,7 +84,7 @@ cron_popen(char *program, char *type, struct passwd *pw) {
                        break;
        argv[MAX_ARGV-1] = NULL;
 
-       switch (pid = vfork()) {
+       switch (pid = fork()) {
        case -1:                        /* error */
                (void)close(pdes[0]);
                (void)close(pdes[1]);