From: Anton Blanchard There were a number of bugs in our cmd_line handling: - We were looking at cmd_line after it had been tokenised. Use saved_command line instead - Use strlcpy instead of memcpy/explicit NULL set. - Remove magic numbers in iseries cmd_line parsing --- arch/ppc64/kernel/chrp_setup.c | 1 - arch/ppc64/kernel/eeh.c | 6 ++---- arch/ppc64/kernel/head.S | 2 +- arch/ppc64/kernel/pmac_setup.c | 1 - arch/ppc64/kernel/prom.c | 6 ++---- arch/ppc64/kernel/setup.c | 2 +- include/asm-ppc64/machdep.h | 1 + 7 files changed, 7 insertions(+), 12 deletions(-) diff -puN arch/ppc64/kernel/chrp_setup.c~ppc64-saved-command-line arch/ppc64/kernel/chrp_setup.c --- 25/arch/ppc64/kernel/chrp_setup.c~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/chrp_setup.c 2004-02-21 20:58:23.000000000 -0800 @@ -129,7 +129,6 @@ void __init chrp_request_regions(void) void __init chrp_setup_arch(void) { - extern char cmd_line[]; struct device_node *root; unsigned int *opprop; diff -puN arch/ppc64/kernel/eeh.c~ppc64-saved-command-line arch/ppc64/kernel/eeh.c --- 25/arch/ppc64/kernel/eeh.c~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/eeh.c 2004-02-21 20:58:23.000000000 -0800 @@ -247,10 +247,8 @@ void eeh_init(void) { struct device_node *phb; struct eeh_early_enable_info info; - - extern char cmd_line[]; /* Very early cmd line parse. Cheap, but works. */ - char *eeh_force_off = strstr(cmd_line, "eeh-force-off"); - char *eeh_force_on = strstr(cmd_line, "eeh-force-on"); + char *eeh_force_off = strstr(saved_command_line, "eeh-force-off"); + char *eeh_force_on = strstr(saved_command_line, "eeh-force-on"); ibm_set_eeh_option = rtas_token("ibm,set-eeh-option"); ibm_set_slot_reset = rtas_token("ibm,set-slot-reset"); diff -puN arch/ppc64/kernel/head.S~ppc64-saved-command-line arch/ppc64/kernel/head.S --- 25/arch/ppc64/kernel/head.S~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/head.S 2004-02-21 20:58:23.000000000 -0800 @@ -2177,4 +2177,4 @@ stab_array: */ .globl cmd_line cmd_line: - .space 512 + .space 512 /* COMMAND_LINE_SIZE */ diff -puN arch/ppc64/kernel/pmac_setup.c~ppc64-saved-command-line arch/ppc64/kernel/pmac_setup.c --- 25/arch/ppc64/kernel/pmac_setup.c~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/pmac_setup.c 2004-02-21 20:58:23.000000000 -0800 @@ -73,7 +73,6 @@ #include "pmac.h" -extern char saved_command_line[]; static int current_root_goodness = -1; #define DEFAULT_ROOT_DEVICE Root_SDA1 /* sda1 - slightly silly choice */ diff -puN arch/ppc64/kernel/prom.c~ppc64-saved-command-line arch/ppc64/kernel/prom.c --- 25/arch/ppc64/kernel/prom.c~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/prom.c 2004-02-21 20:58:23.000000000 -0800 @@ -51,6 +51,7 @@ #include #include #include +#include #include "open_pic.h" #ifdef CONFIG_LOGO_LINUX_CLUT224 @@ -184,7 +185,6 @@ extern void enter_prom(void *dummy,...); extern void copy_and_flush(unsigned long dest, unsigned long src, unsigned long size, unsigned long offset); -extern char cmd_line[512]; /* XXX */ unsigned long dev_tree_size; unsigned long _get_PIR(void); @@ -1497,10 +1497,8 @@ prom_init(unsigned long r3, unsigned lon call_prom(RELOC("getprop"), 4, 1, _prom->chosen, RELOC("bootargs"), p, sizeof(cmd_line)); if (p != NULL && p[0] != 0) - strncpy(RELOC(cmd_line), p, sizeof(cmd_line)); + strlcpy(RELOC(cmd_line), p, sizeof(cmd_line)); } - RELOC(cmd_line[sizeof(cmd_line) - 1]) = 0; - mem = prom_initialize_lmb(mem); diff -puN arch/ppc64/kernel/setup.c~ppc64-saved-command-line arch/ppc64/kernel/setup.c --- 25/arch/ppc64/kernel/setup.c~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/setup.c 2004-02-21 20:58:23.000000000 -0800 @@ -477,7 +477,7 @@ static int __init set_preferred_console( char *name; /* The user has requested a console so this is already set up. */ - if (strstr(cmd_line, "console=")) + if (strstr(saved_command_line, "console=")) return -EBUSY; prom_stdout = find_path_device(of_stdout_device); diff -puN include/asm-ppc64/machdep.h~ppc64-saved-command-line include/asm-ppc64/machdep.h --- 25/include/asm-ppc64/machdep.h~ppc64-saved-command-line 2004-02-21 20:58:23.000000000 -0800 +++ 25-akpm/include/asm-ppc64/machdep.h 2004-02-21 20:58:23.000000000 -0800 @@ -111,6 +111,7 @@ struct machdep_calls { extern struct machdep_calls ppc_md; #define COMMAND_LINE_SIZE 512 extern char cmd_line[COMMAND_LINE_SIZE]; +extern char saved_command_line[COMMAND_LINE_SIZE]; /* Functions to produce codes on the leds. * The SRC code should be unique for the message category and should _