Commit fe713e4b authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] fix incorrect argv[0] for init

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...
parent f5aaaa3e
...@@ -542,12 +542,16 @@ static void do_pre_smp_initcalls(void) ...@@ -542,12 +542,16 @@ static void do_pre_smp_initcalls(void)
spawn_ksoftirqd(); 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); extern void prepare_namespace(void);
static int init(void * unused) static int init(void * unused)
{ {
static char * argv_sh[] = { "sh", NULL, };
lock_kernel(); lock_kernel();
/* /*
* Tell the world that we're going to be the grim * Tell the world that we're going to be the grim
...@@ -592,10 +596,12 @@ static int init(void * unused) ...@@ -592,10 +596,12 @@ static int init(void * unused)
*/ */
if (execute_command) if (execute_command)
execve(execute_command,argv_init,envp_init); run_init_process(execute_command);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init); run_init_process("/sbin/init");
execve("/bin/init",argv_init,envp_init); run_init_process("/etc/init");
execve("/bin/sh",argv_sh,envp_init); run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel."); panic("No init found. Try passing init= option to kernel.");
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment