[PATCH v3 16/27] vfork_daemon_rexec: update spawn_and_wait function to use BB_EXECVP
Nadav Tasher
tashernadav at gmail.com
Mon Jan 27 00:04:27 UTC 2025
Using BB_EXECVP ensures consistency with spawn() function,
and allows moving NOEXEC support to BB_EXECVP, which makes
BB_EXECVP to go-to function for running new processes.
Signed-off-by: Nadav Tasher <tashernadav at gmail.com>
---
libbb/vfork_daemon_rexec.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 2055c4b71..43f09f2f1 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -225,26 +225,27 @@ pid_t FAST_FUNC xspawn(char **argv)
int FAST_FUNC spawn_and_wait(char **argv)
{
int rc;
-#if ENABLE_FEATURE_PREFER_APPLETS && (NUM_APPLETS > 1)
+#if ENABLE_FEATURE_PREFER_APPLETS && (NUM_APPLETS > 1) && NOFORK_SUPPORT
int a = find_applet_by_name(argv[0]);
if (a >= 0) {
if (APPLET_IS_NOFORK(a))
return run_nofork_applet(a, argv);
-# if BB_MMU /* NOEXEC needs fork(), thus this is done only on MMU machines: */
- if (APPLET_IS_NOEXEC(a)) {
- fflush_all();
- rc = fork();
- if (rc) /* parent or error */
- return wait4pid(rc);
-
- /* child */
- run_noexec_applet_and_exit(a, argv[0], argv);
- }
-# endif
}
#endif
+#if BB_MMU /* fork() only allowd on MMU machines */
+ fflush_all();
+ rc = fork();
+
+ /* child */
+ if (rc == 0)
+ BB_EXECVP_or_die(argv);
+#else /* !BB_MMU */
+ /* one call, (v)fork()->BB_EXECVP */
rc = spawn(argv);
+#endif
+
+ /* parent or error */
return wait4pid(rc);
}
--
2.43.0
More information about the busybox
mailing list