
From: Anton Blanchard <anton@samba.org>

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 <asm/ppcdebug.h>
 #include <asm/btext.h>
 #include <asm/sections.h>
+#include <asm/machdep.h>
 #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

_
