nommu: fix cases where we mangle argv[0][0]
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 22 Nov 2011 16:19:26 +0000 (17:19 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 22 Nov 2011 16:19:26 +0000 (17:19 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/cpio.c
include/libbb.h
init/bootchartd.c
networking/httpd.c

index c2a5b8ab9edd17b5aad0cd42b51000cff691a820..98cc18fa07e89df6da7ae53b3805fdf3ab5cb952 100644 (file)
@@ -384,6 +384,7 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
                        goto dump;
                }
                /* parent */
+               USE_FOR_NOMMU(argv[-optind][0] &= 0x7f); /* undo fork_or_rexec() damage */
                xchdir(*argv++);
                close(pp.wr);
                xmove_fd(pp.rd, STDIN_FILENO);
index 3f6fe47edbc6e7e8bfe8a4039f6f2db419231a0d..bc9b7b06df9bab2bd2028040f8692944a9c431cc 100644 (file)
@@ -981,6 +981,9 @@ enum {
 # define bb_daemonize(flags)                bb_daemonize_or_rexec(flags, bogus)
 #else
   extern bool re_execed;
+  /* Note: re_exec() and fork_or_rexec() do argv[0][0] |= 0x80 on NOMMU!
+   * _Parent_ needs to undo it if it doesn't want to have argv[0] mangled.
+   */
   void re_exec(char **argv) NORETURN FAST_FUNC;
   pid_t fork_or_rexec(char **argv) FAST_FUNC;
   int  BUG_fork_is_unavailable_on_nommu(void) FAST_FUNC;
index 5f6121fa476f8e2e19ea67af3569e46447c4d9ab..cc23e6073a211f630eb83fd93d46381b83133ff2 100644 (file)
@@ -418,6 +418,8 @@ int bootchartd_main(int argc UNUSED_PARAM, char **argv)
 
        /* parent */
 
+       USE_FOR_NOMMU(argv[0][0] &= 0x7f); /* undo fork_or_rexec() damage */
+
        if (DO_SIGNAL_SYNC) {
                /* Wait for logger child to set handlers, then unpause it.
                 * Otherwise with short-lived PROG (e.g. "bootchartd start true")
index 24482fe5238acf7002fa7066c572d9ca59bb21e5..ecdf5b5728174dda46b2cb1366c1b3f57c917e0e 100644 (file)
@@ -2243,6 +2243,7 @@ static void mini_httpd_nommu(int server_socket, int argc, char **argv)
                        /* Run a copy of ourself in inetd mode */
                        re_exec(argv_copy);
                }
+               argv_copy[0][0] &= 0x7f;
                /* parent, or vfork failed */
                close(n);
        } /* while (1) */