[git commit] main: fix the case where user has "halt" as login shell. Closes 9986

Denys Vlasenko vda.linux at googlemail.com
Fri Jul 7 17:08:56 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=69a5ec9dccfd183cdf6bee7b994336670755cd47
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

halt::0:0::/:/sbin/halt

function                                             old     new   delta
run_applet_and_exit                                  748     751      +3
run_applet_no_and_exit                               467     459      -8

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h            |  2 +-
 libbb/appletlib.c          | 10 +++++++---
 libbb/vfork_daemon_rexec.c |  2 +-
 shell/ash.c                |  2 +-
 shell/hush.c               |  2 +-
 5 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 1c9de3a..0317c7d 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1117,7 +1117,7 @@ int spawn_and_wait(char **argv) FAST_FUNC;
 int run_nofork_applet(int applet_no, char **argv) FAST_FUNC;
 #ifndef BUILD_INDIVIDUAL
 extern int find_applet_by_name(const char *name) FAST_FUNC;
-extern void run_applet_no_and_exit(int a, char **argv) NORETURN FAST_FUNC;
+extern void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC;
 #endif
 
 /* Helpers for daemonization.
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index 2dea2b4..df65849 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -877,13 +877,17 @@ static int busybox_main(char **argv)
 # endif
 
 # if NUM_APPLETS > 0
-void FAST_FUNC run_applet_no_and_exit(int applet_no, char **argv)
+void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **argv)
 {
 	int argc = string_array_len(argv);
 
 	/* Reinit some shared global data */
 	xfunc_error_retval = EXIT_FAILURE;
-	applet_name = bb_get_last_path_component_nostrip(argv[0]);
+	/*
+	 * We do not use argv[0]: do not want to repeat massaging of
+	 * "-/sbin/halt" -> "halt", for example.
+	 */
+	applet_name = name;
 
 	/* Special case. POSIX says "test --help"
 	 * should be no different from e.g. "test --foo".
@@ -927,7 +931,7 @@ static NORETURN void run_applet_and_exit(const char *name, char **argv)
 	{
 		int applet = find_applet_by_name(name);
 		if (applet >= 0)
-			run_applet_no_and_exit(applet, argv);
+			run_applet_no_and_exit(applet, name, argv);
 	}
 #  endif
 
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 2695f99..576534e 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -180,7 +180,7 @@ int FAST_FUNC spawn_and_wait(char **argv)
 			 * as of yet (and that should probably always stay true).
 			 */
 			/* xfunc_error_retval and applet_name are init by: */
-			run_applet_no_and_exit(a, argv);
+			run_applet_no_and_exit(a, argv[0], argv);
 		}
 # endif
 	}
diff --git a/shell/ash.c b/shell/ash.c
index b7635a8..8c2098d 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -7717,7 +7717,7 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) char *cmd, char **argv, char **
 			clearenv();
 			while (*envp)
 				putenv(*envp++);
-			run_applet_no_and_exit(applet_no, argv);
+			run_applet_no_and_exit(applet_no, cmd, argv);
 		}
 		/* re-exec ourselves with the new arguments */
 		execve(bb_busybox_exec_path, argv, envp);
diff --git a/shell/hush.c b/shell/hush.c
index 4ba6b3f..cf6d8cd 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -7063,7 +7063,7 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
 				/* Do not leak open fds from opened script files etc */
 				close_all_FILE_list();
 				debug_printf_exec("running applet '%s'\n", argv[0]);
-				run_applet_no_and_exit(a, argv);
+				run_applet_no_and_exit(a, argv[0], argv);
 			}
 # endif
 			/* Re-exec ourselves */


More information about the busybox-cvs mailing list