[PATCH v8 06/14] libbb: make spawn and spawn_and_wait use bb_execvp

Nadav Tasher tashernadav at gmail.com
Sun Mar 9 23:55:28 UTC 2025


This change allows moving NOEXEC support to bb_execvp.
This reduces code duplication and broadens the support of
NOEXEC applet execution in the codebase.

Signed-off-by: Nadav Tasher <tashernadav at gmail.com>
---
 libbb/vfork_daemon_rexec.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 2055c4b71..a3de7e742 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -187,8 +187,8 @@ pid_t FAST_FUNC spawn(char **argv)
 	if (pid < 0) /* error */
 		return pid;
 	if (!pid) { /* child */
-		/* This macro is ok - it doesn't do NOEXEC/NOFORK tricks */
-		BB_EXECVP(argv[0], argv);
+		/* bb_execvp might do NOEXEC tricks */
+		bb_execvp(argv[0], argv);
 
 		/* We are (maybe) sharing a stack with blocked parent,
 		 * let parent know we failed and then exit to unblock parent
@@ -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