|
@@ -69,6 +69,7 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/perf_event.h>
|
|
|
#include <linux/file.h>
|
|
|
+#include <linux/ptrace.h>
|
|
|
|
|
|
#include <asm/io.h>
|
|
|
#include <asm/bugs.h>
|
|
@@ -788,10 +789,10 @@ static void __init do_pre_smp_initcalls(void)
|
|
|
do_one_initcall(*fn);
|
|
|
}
|
|
|
|
|
|
-static void run_init_process(const char *init_filename)
|
|
|
+static int run_init_process(const char *init_filename)
|
|
|
{
|
|
|
argv_init[0] = init_filename;
|
|
|
- kernel_execve(init_filename, argv_init, envp_init);
|
|
|
+ return kernel_execve(init_filename, argv_init, envp_init);
|
|
|
}
|
|
|
|
|
|
static void __init kernel_init_freeable(void);
|
|
@@ -810,7 +811,8 @@ static int __ref kernel_init(void *unused)
|
|
|
flush_delayed_fput();
|
|
|
|
|
|
if (ramdisk_execute_command) {
|
|
|
- run_init_process(ramdisk_execute_command);
|
|
|
+ if (!run_init_process(ramdisk_execute_command))
|
|
|
+ return 0;
|
|
|
printk(KERN_WARNING "Failed to execute %s\n",
|
|
|
ramdisk_execute_command);
|
|
|
}
|
|
@@ -822,14 +824,16 @@ static int __ref kernel_init(void *unused)
|
|
|
* trying to recover a really broken machine.
|
|
|
*/
|
|
|
if (execute_command) {
|
|
|
- run_init_process(execute_command);
|
|
|
+ if (!run_init_process(execute_command))
|
|
|
+ return 0;
|
|
|
printk(KERN_WARNING "Failed to execute %s. Attempting "
|
|
|
"defaults...\n", execute_command);
|
|
|
}
|
|
|
- run_init_process("/sbin/init");
|
|
|
- run_init_process("/etc/init");
|
|
|
- run_init_process("/bin/init");
|
|
|
- run_init_process("/bin/sh");
|
|
|
+ if (!run_init_process("/sbin/init") ||
|
|
|
+ !run_init_process("/etc/init") ||
|
|
|
+ !run_init_process("/bin/init") ||
|
|
|
+ !run_init_process("/bin/sh"))
|
|
|
+ return 0;
|
|
|
|
|
|
panic("No init found. Try passing init= option to kernel. "
|
|
|
"See Linux Documentation/init.txt for guidance.");
|