Avoid calling exit() from within fork/vfork'ed processes.
authorEric Andersen <andersen@codepoet.org>
Thu, 26 Sep 2002 13:59:40 +0000 (13:59 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 26 Sep 2002 13:59:40 +0000 (13:59 -0000)
 -Erik

shell/lash.c

index 11e7dec709c14fa3be6ccffdf542dae3e3ea00e2..5c4e97f4aa47c083a81db4433514b44a6290b955 100644 (file)
@@ -1214,7 +1214,7 @@ static int pseudo_exec(struct child_prog *child)
         */
        for (x = bltins; x->cmd; x++) {
                if (strcmp(child->argv[0], x->cmd) == 0 ) {
-                       exit(x->function(child));
+                       _exit(x->function(child));
                }
        }
 
@@ -1222,7 +1222,7 @@ static int pseudo_exec(struct child_prog *child)
        for (x = bltins_forking; x->cmd; x++) {
                if (strcmp(child->argv[0], x->cmd) == 0) {
                        applet_name=x->cmd;
-                       exit (x->function(child));
+                       _exit (x->function(child));
                }
        }
 #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
@@ -1258,7 +1258,11 @@ static int pseudo_exec(struct child_prog *child)
 #endif
 
        execvp(child->argv[0], child->argv);
-       perror_msg_and_die("%s", child->argv[0]);
+
+       /* Do not use perror_msg_and_die() here, since we must not 
+        * call exit() but should call _exit() instead */
+       fprintf(stderr, "%s: %s\n", child->argv[0], strerror(err));
+       _exit(EXIT_FAILURE);
 }
 
 static void insert_job(struct job *newjob, int inbg)