From: Erik Andersen <andersen@codepoet.org>

When someone specifies "init=" to select an alternative binary to run
instead of /sbin/init, argv[0] is not set correctly.  This is a problem for
programs such as busybox that multiplex applications based on the value of
argv[0].  For example, even if you specify init=/bin/sh" on the kernel
command line, busybox will still receive "/sbin/init" as argv[0] and will
therefore run init rather than /bin/sh...



 init/main.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff -puN init/main.c~init-argv-fix init/main.c
--- 25/init/main.c~init-argv-fix	2003-09-13 11:32:35.000000000 -0700
+++ 25-akpm/init/main.c	2003-09-13 21:04:32.000000000 -0700
@@ -542,12 +542,16 @@ static void do_pre_smp_initcalls(void)
 	spawn_ksoftirqd();
 }
 
+static void run_init_process(char *init_filename)
+{
+	argv_init[0] = init_filename;
+	execve(init_filename, argv_init, envp_init);
+}
+
 extern void prepare_namespace(void);
 
 static int init(void * unused)
 {
-	static char * argv_sh[] = { "sh", NULL, };
-
 	lock_kernel();
 	/*
 	 * Tell the world that we're going to be the grim
@@ -592,10 +596,12 @@ static int init(void * unused)
 	 */
 
 	if (execute_command)
-		execve(execute_command,argv_init,envp_init);
-	execve("/sbin/init",argv_init,envp_init);
-	execve("/etc/init",argv_init,envp_init);
-	execve("/bin/init",argv_init,envp_init);
-	execve("/bin/sh",argv_sh,envp_init);
+		run_init_process(execute_command);
+
+	run_init_process("/sbin/init");
+	run_init_process("/etc/init");
+	run_init_process("/bin/init");
+	run_init_process("/bin/sh");
+
 	panic("No init found.  Try passing init= option to kernel.");
 }

_