revert last two commits. vfork cannot be used in subroutine,
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Jul 2008 15:59:42 +0000 (15:59 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Jul 2008 15:59:42 +0000 (15:59 -0000)
it trashes stack on return

15 files changed:
archival/libunarchive/open_transformer.c
archival/tar.c
debianutils/start_stop_daemon.c
include/libbb.h
libbb/Kbuild
libbb/vfork_daemon_rexec.c
libbb/xvfork.c [deleted file]
miscutils/crontab.c
miscutils/time.c
networking/ifupdown.c
networking/inetd.c
networking/sendmail.c
shell/hush.c
util-linux/mount.c
util-linux/script.c

index 0738e3db18b5c167142441b612419320b7a0ecbf..a6bc623215182320a82153f3f6cb5d4f798a3b2c 100644 (file)
@@ -20,7 +20,16 @@ int FAST_FUNC open_transformer(int src_fd,
 
        xpiped_pair(fd_pipe);
 
-       pid = BB_MMU ? xfork() : xvfork();
+#if BB_MMU
+       pid = fork();
+       if (pid == -1)
+               bb_perror_msg_and_die("can't fork");
+#else
+       pid = vfork();
+       if (pid == -1)
+               bb_perror_msg_and_die("can't vfork");
+#endif
+
        if (pid == 0) {
                /* child process */
                close(fd_pipe.rd); /* We don't want to read from the parent */
index 17ac6c55a124be2319259ad199a2d3619f1f1f6e..526edb69d59eed7cb80b8cd9094fb99e67f3d3f1 100644 (file)
@@ -536,7 +536,9 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
        (void) &zip_exec;
 #endif
 
-       gzipPid = xvfork();
+       gzipPid = vfork();
+       if (gzipPid < 0)
+               bb_perror_msg_and_die("can't vfork");
 
        if (gzipPid == 0) {
                /* child */
index f10572ddf58c27680be95b26cfc003941b9fca3c..459fb77e0fe98556a7c461aab2dc751ea8b241f7 100644 (file)
@@ -404,7 +404,9 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
                /* DAEMON_DEVNULL_STDIO is superfluous -
                 * it's always done by bb_daemonize() */
 #else
-               pid_t pid = xvfork();
+               pid_t pid = vfork();
+               if (pid < 0) /* error */
+                       bb_perror_msg_and_die("vfork");
                if (pid != 0) {
                        /* parent */
                        /* why _exit? the child may have changed the stack,
index 67eef6dbb61b3c44cd444b1e46977197dc86a043..54601f87b4b09d24eed78784d1e56b1160b675d5 100644 (file)
@@ -719,11 +719,6 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
 #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
 #endif
 
-#if BB_MMU
-pid_t xfork(void) FAST_FUNC;
-#endif
-pid_t xvfork(void) FAST_FUNC;
-
 /* NOMMU friendy fork+exec */
 pid_t spawn(char **argv) FAST_FUNC;
 pid_t xspawn(char **argv) FAST_FUNC;
index 5ace87cad8a5f246182dec54a558d5b6064c19ff..5cbecd537b1ab8b19b5a7aa0006371c8f1c9bce5 100644 (file)
@@ -109,7 +109,6 @@ lib-y += xfunc_die.o
 lib-y += xgetcwd.o
 lib-y += xgethostbyname.o
 lib-y += xreadlink.o
-lib-y += xvfork.o
 
 # conditionally compiled objects:
 lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o
index 989e9b8415729dfebec9531aa9ed67494703d9c8..37d4c274e9fa420a2225af5dbea2d44570e257d1 100644 (file)
@@ -226,7 +226,9 @@ void FAST_FUNC forkexit_or_rexec(char **argv)
        if (re_execed)
                return;
 
-       pid = xvfork();
+       pid = vfork();
+       if (pid < 0) /* wtf? */
+               bb_perror_msg_and_die("vfork");
        if (pid) /* parent */
                exit(EXIT_SUCCESS);
        /* child - re-exec ourself */
@@ -238,7 +240,9 @@ void FAST_FUNC forkexit_or_rexec(char **argv)
 void FAST_FUNC forkexit_or_rexec(void)
 {
        pid_t pid;
-       pid = xfork();
+       pid = fork();
+       if (pid < 0) /* wtf? */
+               bb_perror_msg_and_die("fork");
        if (pid) /* parent */
                exit(EXIT_SUCCESS);
        /* child */
diff --git a/libbb/xvfork.c b/libbb/xvfork.c
deleted file mode 100644 (file)
index 3fbd0c1..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Utility routines.
- *
- * Copyright (C) 2007 Denys Vlasenko
- *
- * Licensed under GPL version 2, see file LICENSE in this tarball for details.
- */
-
-#include "libbb.h"
-
-pid_t FAST_FUNC xvfork(void)
-{
-       pid_t pid = vfork();
-       if (pid < 0)
-               bb_perror_msg_and_die("vfork");
-       return pid;
-}
-
-#if BB_MMU
-pid_t FAST_FUNC xfork(void)
-{
-       pid_t pid = fork();
-       if (pid < 0)
-               bb_perror_msg_and_die("vfork" + 1);
-       return pid;
-}
-#endif
index 4bba9fb44e9245dc3b47d356650f676c6235d542..dc3179dac20add33b8464041321d9433e8e7a246 100644 (file)
@@ -38,8 +38,10 @@ static void change_user(const struct passwd *pas)
 static void edit_file(const struct passwd *pas, const char *file)
 {
        const char *ptr;
-       int pid = xvfork();
+       int pid = vfork();
 
+       if (pid < 0) /* failure */
+               bb_perror_msg_and_die("vfork");
        if (pid) { /* parent */
                wait4pid(pid);
                return;
@@ -63,7 +65,9 @@ static int open_as_user(const struct passwd *pas, const char *file)
        pid_t pid;
        char c;
 
-       pid = xvfork();
+       pid = vfork();
+       if (pid < 0) /* ERROR */
+               bb_perror_msg_and_die("vfork");
        if (pid) { /* PARENT */
                if (wait4pid(pid) == 0) {
                        /* exitcode 0: child says it can read */
index 104548c2369bc2042239fb248c52f365a9f78a9c..a6d158c53dc25e14397616a802b46c058a12c6fd 100644 (file)
@@ -372,7 +372,9 @@ static void run_command(char *const *cmd, resource_t *resp)
        void (*quit_signal)(int);
 
        resp->elapsed_ms = monotonic_us() / 1000;
-       pid = xvfork();         /* Run CMD as child process.  */
+       pid = vfork();          /* Run CMD as child process.  */
+       if (pid < 0)
+               bb_error_msg_and_die("cannot fork");
        if (pid == 0) { /* If child.  */
                /* Don't cast execvp arguments; that causes errors on some systems,
                   versus merely warnings if the cast is left off.  */
index 8caff3f4d80f555eb7267e3416505b6e5e14e505..c12391863acef2ec95e998c56c32b2715a925433 100644 (file)
@@ -1008,9 +1008,12 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
        xpiped_pair(outfd);
 
        fflush(NULL);
-       pid = xvfork();
+       pid = vfork();
 
-       if (pid == 0) { /* child */
+       switch (pid) {
+       case -1:  /* failure */
+               bb_perror_msg_and_die("vfork");
+       case 0:  /* child */
                /* NB: close _first_, then move fds! */
                close(infd.wr);
                close(outfd.rd);
index 0028078db7f2636cd488c338fa672a0b86a8fe5d..08c09953bd39da3ff4f4f34230d2c748c81c3331 100644 (file)
@@ -1303,7 +1303,7 @@ int inetd_main(int argc ATTRIBUTE_UNUSED, char **argv)
                                        pid = vfork();
 
                                if (pid < 0) { /* fork error */
-                                       bb_perror_msg(BB_MMU ? "vfork" + 1 : "vfork");
+                                       bb_perror_msg("fork");
                                        sleep(1);
                                        restore_sigmask(&omask);
                                        maybe_close(accepted_fd);
index c195cc021b732bdee0f60aefd35edd12778c0814..1c23ca290f758c9733136a2317443e6365f7a1ee 100644 (file)
@@ -120,6 +120,15 @@ static void signal_handler(int signo)
 #undef err
 }
 
+/* libbb candidate */
+static pid_t vfork_or_die(void)
+{
+       pid_t pid = vfork();
+       if (pid < 0)
+               bb_perror_msg_and_die("vfork");
+       return pid;
+}
+
 static void launch_helper(const char **argv)
 {
        // setup vanilla unidirectional pipes interchange
@@ -128,7 +137,7 @@ static void launch_helper(const char **argv)
 
        xpipe(pipes);
        xpipe(pipes+2);
-       helper_pid = xvfork();
+       helper_pid = vfork_or_die();
        idx = (!helper_pid) * 2;
        xdup2(pipes[idx], STDIN_FILENO);
        xdup2(pipes[3-idx], STDOUT_FILENO);
index 27fab0d1b04a3b6dbb3813fe28a658634fe3bdb8..72186f9704bea3566e14aef7a89b76421d6ade70 100644 (file)
@@ -1902,7 +1902,7 @@ static int run_pipe(struct pipe *pi)
 #endif
                if (child->pid < 0) { /* [v]fork failed */
                        /* Clearly indicate, was it fork or vfork */
-                       bb_perror_msg(BB_MMU ? "vfork" + 1 : "vfork");
+                       bb_perror_msg(BB_MMU ? "fork" : "vfork");
                } else {
                        pi->alive_progs++;
 #if ENABLE_HUSH_JOB
@@ -3096,7 +3096,9 @@ static FILE *generate_stream_from_list(struct pipe *head)
  * huge=`cat TESTFILE` # will block here forever
  * echo OK
  */
-       pid = BB_MMU ? xfork() : xvfork();
+       pid = BB_MMU ? fork() : vfork();
+       if (pid < 0)
+               bb_perror_msg_and_die(BB_MMU ? "fork" : "vfork");
        if (pid == 0) { /* child */
                if (ENABLE_HUSH_JOB)
                        die_sleep = 0; /* let nofork's xfuncs die */
index 664d24fd8c334eab40a88dce12325ea5c0bad9ff..3b77af728ec6b6983ab9d8f9af445693d3f7a93f 100644 (file)
@@ -890,7 +890,6 @@ get_mountport(struct pmap *pm_mnt,
 }
 
 #if BB_MMU
-/* Unlike bb_daemonize(), parent does NOT exit here, but returns 0 */
 static int daemonize(void)
 {
        int fd;
index a6c1ab88a359a97314941d6727e1a91279253018..e70294e6cbd229e17952219f5ad92564c9882cae 100644 (file)
@@ -87,7 +87,10 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        /* TODO: SIGWINCH? pass window size changes down to slave? */
 
-       child_pid = xvfork();
+       child_pid = vfork();
+       if (child_pid < 0) {
+               bb_perror_msg_and_die("vfork");
+       }
 
        if (child_pid) {
                /* parent */