← Commit list

a26711a2d

Denys Vlasenko
Denys Vlasenko
2023-04-06
SUCCESS Duration: 156s

Subject

libbb: consolidate NOMMU fix of restoring high bit in argv[0][0]

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

archival/cpio.c+0 -1
@@ -504,7 +504,6 @@ 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);
include/libbb.h+1 -1
@@ -1319,7 +1319,7 @@ 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!
+ /* Note: re_exec() sets 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;
init/bootchartd.c+0 -2
@@ -435,8 +435,6 @@ 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")
libbb/vfork_daemon_rexec.c+6 -4
@@ -268,10 +268,12 @@ pid_t FAST_FUNC fork_or_rexec(char **argv)
/* fflush_all(); ? - so far all callers had no buffered output to flush */
pid = xvfork();
- if (pid) /* parent */
- return pid;
- /* child - re-exec ourself */
- re_exec(argv);
+ if (pid == 0) /* child - re-exec ourself */
+ re_exec(argv); /* NORETURN */
+
+ /* parent */
+ argv[0][0] &= 0x7f; /* undo re_rexec() damage */
+ return pid;
}
#endif
networking/httpd.c+1 -1
@@ -2713,8 +2713,8 @@ 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 */
+ argv_copy[0][0] &= 0x7f; /* undo re_rexec() damage */
close(n);
} /* while (1) */
/* never reached */