[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