diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-04-06 21:20:28 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-04-06 21:20:28 +0200 |
commit | a26711a2d1464167be4ebc990fe21a3809a2da34 (patch) | |
tree | c48559fea73287479418e5f10d38157f5377cae4 | |
parent | 05f2bedaebd694605abd1f199fc25d93ad73840b (diff) | |
download | busybox-w32-a26711a2d1464167be4ebc990fe21a3809a2da34.tar.gz busybox-w32-a26711a2d1464167be4ebc990fe21a3809a2da34.tar.bz2 busybox-w32-a26711a2d1464167be4ebc990fe21a3809a2da34.zip |
libbb: consolidate NOMMU fix of restoring high bit in argv[0][0]
function old new delta
fork_or_rexec 46 56 +10
bootchartd_main 1087 1079 -8
cpio_main 674 661 -13
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 10/-21) Total: -11 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/cpio.c | 1 | ||||
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | init/bootchartd.c | 2 | ||||
-rw-r--r-- | libbb/vfork_daemon_rexec.c | 10 | ||||
-rw-r--r-- | networking/httpd.c | 2 |
5 files changed, 8 insertions, 9 deletions
diff --git a/archival/cpio.c b/archival/cpio.c index 7149782d7..839a15621 100644 --- a/archival/cpio.c +++ b/archival/cpio.c | |||
@@ -504,7 +504,6 @@ int cpio_main(int argc UNUSED_PARAM, char **argv) | |||
504 | goto dump; | 504 | goto dump; |
505 | } | 505 | } |
506 | /* parent */ | 506 | /* parent */ |
507 | USE_FOR_NOMMU(argv[-optind][0] &= 0x7f); /* undo fork_or_rexec() damage */ | ||
508 | xchdir(*argv++); | 507 | xchdir(*argv++); |
509 | close(pp.wr); | 508 | close(pp.wr); |
510 | xmove_fd(pp.rd, STDIN_FILENO); | 509 | xmove_fd(pp.rd, STDIN_FILENO); |
diff --git a/include/libbb.h b/include/libbb.h index cca33a177..6191debb1 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -1319,7 +1319,7 @@ enum { | |||
1319 | # define bb_daemonize(flags) bb_daemonize_or_rexec(flags, bogus) | 1319 | # define bb_daemonize(flags) bb_daemonize_or_rexec(flags, bogus) |
1320 | #else | 1320 | #else |
1321 | extern bool re_execed; | 1321 | extern bool re_execed; |
1322 | /* Note: re_exec() and fork_or_rexec() do argv[0][0] |= 0x80 on NOMMU! | 1322 | /* Note: re_exec() sets argv[0][0] |= 0x80 on NOMMU! |
1323 | * _Parent_ needs to undo it if it doesn't want to have argv[0] mangled. | 1323 | * _Parent_ needs to undo it if it doesn't want to have argv[0] mangled. |
1324 | */ | 1324 | */ |
1325 | void re_exec(char **argv) NORETURN FAST_FUNC; | 1325 | void re_exec(char **argv) NORETURN FAST_FUNC; |
diff --git a/init/bootchartd.c b/init/bootchartd.c index ae1ee9d9a..0929890a3 100644 --- a/init/bootchartd.c +++ b/init/bootchartd.c | |||
@@ -435,8 +435,6 @@ int bootchartd_main(int argc UNUSED_PARAM, char **argv) | |||
435 | 435 | ||
436 | /* parent */ | 436 | /* parent */ |
437 | 437 | ||
438 | USE_FOR_NOMMU(argv[0][0] &= 0x7f); /* undo fork_or_rexec() damage */ | ||
439 | |||
440 | if (DO_SIGNAL_SYNC) { | 438 | if (DO_SIGNAL_SYNC) { |
441 | /* Wait for logger child to set handlers, then unpause it. | 439 | /* Wait for logger child to set handlers, then unpause it. |
442 | * Otherwise with short-lived PROG (e.g. "bootchartd start true") | 440 | * Otherwise with short-lived PROG (e.g. "bootchartd start true") |
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 79141936a..a570ddbf2 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c | |||
@@ -268,10 +268,12 @@ pid_t FAST_FUNC fork_or_rexec(char **argv) | |||
268 | /* fflush_all(); ? - so far all callers had no buffered output to flush */ | 268 | /* fflush_all(); ? - so far all callers had no buffered output to flush */ |
269 | 269 | ||
270 | pid = xvfork(); | 270 | pid = xvfork(); |
271 | if (pid) /* parent */ | 271 | if (pid == 0) /* child - re-exec ourself */ |
272 | return pid; | 272 | re_exec(argv); /* NORETURN */ |
273 | /* child - re-exec ourself */ | 273 | |
274 | re_exec(argv); | 274 | /* parent */ |
275 | argv[0][0] &= 0x7f; /* undo re_rexec() damage */ | ||
276 | return pid; | ||
275 | } | 277 | } |
276 | #endif | 278 | #endif |
277 | 279 | ||
diff --git a/networking/httpd.c b/networking/httpd.c index 252ad6c2d..ddcb03bca 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
@@ -2713,8 +2713,8 @@ static void mini_httpd_nommu(int server_socket, int argc, char **argv) | |||
2713 | /* Run a copy of ourself in inetd mode */ | 2713 | /* Run a copy of ourself in inetd mode */ |
2714 | re_exec(argv_copy); | 2714 | re_exec(argv_copy); |
2715 | } | 2715 | } |
2716 | argv_copy[0][0] &= 0x7f; | ||
2717 | /* parent, or vfork failed */ | 2716 | /* parent, or vfork failed */ |
2717 | argv_copy[0][0] &= 0x7f; /* undo re_rexec() damage */ | ||
2718 | close(n); | 2718 | close(n); |
2719 | } /* while (1) */ | 2719 | } /* while (1) */ |
2720 | /* never reached */ | 2720 | /* never reached */ |