diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-11-22 17:19:26 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-11-22 17:19:26 +0100 |
commit | d2277e262ff7dd2dd946ea16b93462f3dcdf0447 (patch) | |
tree | 985e045011ef9eb5b0136ce36c321cce015e56d7 | |
parent | fcb9e07eca65b98093dd0b2b80451934a8719914 (diff) | |
download | busybox-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.c | 1 | ||||
-rw-r--r-- | include/libbb.h | 3 | ||||
-rw-r--r-- | init/bootchartd.c | 2 | ||||
-rw-r--r-- | networking/httpd.c | 1 |
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) */ |