aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-11-22 17:19:26 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-11-22 17:19:26 +0100
commitd2277e262ff7dd2dd946ea16b93462f3dcdf0447 (patch)
tree985e045011ef9eb5b0136ce36c321cce015e56d7
parentfcb9e07eca65b98093dd0b2b80451934a8719914 (diff)
downloadbusybox-w32-d2277e262ff7dd2dd946ea16b93462f3dcdf0447.tar.gz
busybox-w32-d2277e262ff7dd2dd946ea16b93462f3dcdf0447.tar.bz2
busybox-w32-d2277e262ff7dd2dd946ea16b93462f3dcdf0447.zip
nommu: fix cases where we mangle argv[0][0]
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/cpio.c1
-rw-r--r--include/libbb.h3
-rw-r--r--init/bootchartd.c2
-rw-r--r--networking/httpd.c1
4 files changed, 7 insertions, 0 deletions
diff --git a/archival/cpio.c b/archival/cpio.c
index c2a5b8ab9..98cc18fa0 100644
--- a/archival/cpio.c
+++ b/archival/cpio.c
@@ -384,6 +384,7 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
384 goto dump; 384 goto dump;
385 } 385 }
386 /* parent */ 386 /* parent */
387 USE_FOR_NOMMU(argv[-optind][0] &= 0x7f); /* undo fork_or_rexec() damage */
387 xchdir(*argv++); 388 xchdir(*argv++);
388 close(pp.wr); 389 close(pp.wr);
389 xmove_fd(pp.rd, STDIN_FILENO); 390 xmove_fd(pp.rd, STDIN_FILENO);
diff --git a/include/libbb.h b/include/libbb.h
index 3f6fe47ed..bc9b7b06d 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -981,6 +981,9 @@ enum {
981# define bb_daemonize(flags) bb_daemonize_or_rexec(flags, bogus) 981# define bb_daemonize(flags) bb_daemonize_or_rexec(flags, bogus)
982#else 982#else
983 extern bool re_execed; 983 extern bool re_execed;
984 /* Note: re_exec() and fork_or_rexec() do argv[0][0] |= 0x80 on NOMMU!
985 * _Parent_ needs to undo it if it doesn't want to have argv[0] mangled.
986 */
984 void re_exec(char **argv) NORETURN FAST_FUNC; 987 void re_exec(char **argv) NORETURN FAST_FUNC;
985 pid_t fork_or_rexec(char **argv) FAST_FUNC; 988 pid_t fork_or_rexec(char **argv) FAST_FUNC;
986 int BUG_fork_is_unavailable_on_nommu(void) FAST_FUNC; 989 int BUG_fork_is_unavailable_on_nommu(void) FAST_FUNC;
diff --git a/init/bootchartd.c b/init/bootchartd.c
index 5f6121fa4..cc23e6073 100644
--- a/init/bootchartd.c
+++ b/init/bootchartd.c
@@ -418,6 +418,8 @@ int bootchartd_main(int argc UNUSED_PARAM, char **argv)
418 418
419 /* parent */ 419 /* parent */
420 420
421 USE_FOR_NOMMU(argv[0][0] &= 0x7f); /* undo fork_or_rexec() damage */
422
421 if (DO_SIGNAL_SYNC) { 423 if (DO_SIGNAL_SYNC) {
422 /* Wait for logger child to set handlers, then unpause it. 424 /* Wait for logger child to set handlers, then unpause it.
423 * Otherwise with short-lived PROG (e.g. "bootchartd start true") 425 * Otherwise with short-lived PROG (e.g. "bootchartd start true")
diff --git a/networking/httpd.c b/networking/httpd.c
index 24482fe52..ecdf5b572 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -2243,6 +2243,7 @@ static void mini_httpd_nommu(int server_socket, int argc, char **argv)
2243 /* Run a copy of ourself in inetd mode */ 2243 /* Run a copy of ourself in inetd mode */
2244 re_exec(argv_copy); 2244 re_exec(argv_copy);
2245 } 2245 }
2246 argv_copy[0][0] &= 0x7f;
2246 /* parent, or vfork failed */ 2247 /* parent, or vfork failed */
2247 close(n); 2248 close(n);
2248 } /* while (1) */ 2249 } /* while (1) */