aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-04-06 21:20:28 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-04-06 21:20:28 +0200
commita26711a2d1464167be4ebc990fe21a3809a2da34 (patch)
treec48559fea73287479418e5f10d38157f5377cae4
parent05f2bedaebd694605abd1f199fc25d93ad73840b (diff)
downloadbusybox-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.c1
-rw-r--r--include/libbb.h2
-rw-r--r--init/bootchartd.c2
-rw-r--r--libbb/vfork_daemon_rexec.c10
-rw-r--r--networking/httpd.c2
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 */