From: Anton Blanchard cmd_line was twice the size of saved_command_line but we did a strcpy from the larger into the smaller. Create COMMAND_LINE_SIZE and use it. --- arch/ppc/kernel/setup.c | 8 ++++---- arch/ppc64/kernel/setup.c | 6 +++--- include/asm-ppc/machdep.h | 3 ++- include/asm-ppc64/machdep.h | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff -puN arch/ppc64/kernel/setup.c~ppc64-saved-command-line-length-fix arch/ppc64/kernel/setup.c --- 25/arch/ppc64/kernel/setup.c~ppc64-saved-command-line-length-fix 2004-02-15 23:43:13.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/setup.c 2004-02-15 23:43:13.000000000 -0800 @@ -80,7 +80,7 @@ unsigned long decr_overclock_proc0_set = int powersave_nap; -char saved_command_line[256]; +char saved_command_line[COMMAND_LINE_SIZE]; unsigned char aux_device_present; void parse_cmd_line(unsigned long r3, unsigned long r4, unsigned long r5, @@ -536,7 +536,7 @@ int parse_bootinfo(void) for ( ; rec->tag != BI_LAST ; rec = bi_rec_next(rec) ) { switch (rec->tag) { case BI_CMD_LINE: - memcpy(cmd_line, (void *)rec->data, rec->size); + strlcpy(cmd_line, (void *)rec->data, sizeof(cmd_line)); break; case BI_SYSMAP: sysmap = __va(rec->data[0]); @@ -620,7 +620,7 @@ void __init setup_arch(char **cmdline_p) init_mm.brk = klimit; /* Save unparsed command line copy for /proc/cmdline */ - strcpy(saved_command_line, cmd_line); + strlcpy(saved_command_line, cmd_line, sizeof(saved_command_line)); *cmdline_p = cmd_line; /* set up the bootmem stuff with available memory */ diff -puN arch/ppc/kernel/setup.c~ppc64-saved-command-line-length-fix arch/ppc/kernel/setup.c --- 25/arch/ppc/kernel/setup.c~ppc64-saved-command-line-length-fix 2004-02-15 23:43:13.000000000 -0800 +++ 25-akpm/arch/ppc/kernel/setup.c 2004-02-15 23:43:13.000000000 -0800 @@ -53,7 +53,7 @@ extern void ppc6xx_idle(void); extern void power4_idle(void); extern boot_infos_t *boot_infos; -char saved_command_line[256]; +char saved_command_line[COMMAND_LINE_SIZE]; unsigned char aux_device_present; struct ide_machdep_calls ppc_ide_md; char *sysmap; @@ -501,7 +501,7 @@ void parse_bootinfo(struct bi_record *re ulong *data = rec->data; switch (rec->tag) { case BI_CMD_LINE: - memcpy(cmd_line, (void *)data, rec->size); + strlcpy(cmd_line, (void *)data, sizeof(cmd_line)); break; case BI_SYSMAP: sysmap = (char *)((data[0] >= (KERNELBASE)) ? data[0] : @@ -538,7 +538,7 @@ machine_init(unsigned long r3, unsigned unsigned long r6, unsigned long r7) { #ifdef CONFIG_CMDLINE - strcpy(cmd_line, CONFIG_CMDLINE); + strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line)); #endif /* CONFIG_CMDLINE */ #ifdef CONFIG_6xx @@ -676,7 +676,7 @@ void __init setup_arch(char **cmdline_p) init_mm.brk = (unsigned long) klimit; /* Save unparsed command line copy for /proc/cmdline */ - strcpy(saved_command_line, cmd_line); + strlcpy(saved_command_line, cmd_line, sizeof(saved_command_line)); *cmdline_p = cmd_line; /* set up the bootmem stuff with available memory */ diff -puN include/asm-ppc64/machdep.h~ppc64-saved-command-line-length-fix include/asm-ppc64/machdep.h --- 25/include/asm-ppc64/machdep.h~ppc64-saved-command-line-length-fix 2004-02-15 23:43:13.000000000 -0800 +++ 25-akpm/include/asm-ppc64/machdep.h 2004-02-15 23:43:13.000000000 -0800 @@ -109,7 +109,8 @@ struct machdep_calls { }; extern struct machdep_calls ppc_md; -extern char cmd_line[512]; +#define COMMAND_LINE_SIZE 512 +extern char cmd_line[COMMAND_LINE_SIZE]; /* Functions to produce codes on the leds. * The SRC code should be unique for the message category and should diff -puN include/asm-ppc/machdep.h~ppc64-saved-command-line-length-fix include/asm-ppc/machdep.h --- 25/include/asm-ppc/machdep.h~ppc64-saved-command-line-length-fix 2004-02-15 23:43:13.000000000 -0800 +++ 25-akpm/include/asm-ppc/machdep.h 2004-02-15 23:43:13.000000000 -0800 @@ -104,7 +104,8 @@ struct machdep_calls { }; extern struct machdep_calls ppc_md; -extern char cmd_line[512]; +#define COMMAND_LINE_SIZE 512 +extern char cmd_line[COMMAND_LINE_SIZE]; extern void setup_pci_ptrs(void); _