cf4a81
From 21eb397a5fc9227cd95d23e8c74a49cf6a293e57 Mon Sep 17 00:00:00 2001
cf4a81
From: Hari Bathini <hbathini@linux.vnet.ibm.com>
cf4a81
Date: Wed, 9 Aug 2017 23:47:42 +0530
cf4a81
Subject: [PATCH] kexec-tools: powerpc: fix command line overflow error
cf4a81
cf4a81
Since kernel commit a5980d064fe2 ("powerpc: Bump COMMAND_LINE_SIZE
cf4a81
to 2048"), powerpc bumped command line size to 2048 but the size
cf4a81
used here is still the default value of 512. Bump it to 2048 to
cf4a81
fix command line overflow errors observed when command line length
cf4a81
is above 512 bytes. Also, get rid of the multiple definitions of
cf4a81
COMMAND_LINE_SIZE macro in ppc architecture.
cf4a81
cf4a81
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
cf4a81
Signed-off-by: Simon Horman <horms@verge.net.au>
cf4a81
Signed-off-by: Pingfan Liu <piliu@redhat.com>
cf4a81
---
cf4a81
 kexec/arch/ppc/crashdump-powerpc.c | 6 +++++-
cf4a81
 kexec/arch/ppc/crashdump-powerpc.h | 2 --
cf4a81
 kexec/arch/ppc/fs2dt.c             | 1 -
cf4a81
 kexec/arch/ppc/kexec-ppc.h         | 3 ++-
cf4a81
 kexec/arch/ppc/ops.h               | 1 -
cf4a81
 kexec/arch/ppc64/crashdump-ppc64.c | 6 ++++--
cf4a81
 kexec/arch/ppc64/crashdump-ppc64.h | 2 +-
cf4a81
 7 files changed, 12 insertions(+), 9 deletions(-)
cf4a81
cf4a81
diff --git a/kexec/arch/ppc/crashdump-powerpc.c b/kexec/arch/ppc/crashdump-powerpc.c
cf4a81
index dde6de7..4ad026f 100644
cf4a81
--- a/kexec/arch/ppc/crashdump-powerpc.c
cf4a81
+++ b/kexec/arch/ppc/crashdump-powerpc.c
cf4a81
@@ -252,8 +252,12 @@ static void ulltoa(unsigned long long i, char *str)
cf4a81
 /* Append str to cmdline */
cf4a81
 static void add_cmdline(char *cmdline, char *str)
cf4a81
 {
cf4a81
+	int cmdline_size;
cf4a81
 	int cmdlen = strlen(cmdline) + strlen(str);
cf4a81
-	if (cmdlen > (COMMAND_LINE_SIZE - 1))
cf4a81
+
cf4a81
+	cmdline_size = (kernel_version() < KERNEL_VERSION(3, 10, 0) ?
cf4a81
+			512 : COMMAND_LINE_SIZE);
cf4a81
+	if (cmdlen > (cmdline_size - 1))
cf4a81
 		die("Command line overflow\n");
cf4a81
 	strcat(cmdline, str);
cf4a81
 }
cf4a81
diff --git a/kexec/arch/ppc/crashdump-powerpc.h b/kexec/arch/ppc/crashdump-powerpc.h
cf4a81
index 9b9b01e..97b5095 100644
cf4a81
--- a/kexec/arch/ppc/crashdump-powerpc.h
cf4a81
+++ b/kexec/arch/ppc/crashdump-powerpc.h
cf4a81
@@ -20,8 +20,6 @@ extern struct arch_options_t arch_options;
cf4a81
 #define KERNELBASE	PAGE_OFFSET
cf4a81
 #define __pa(x)		((unsigned long)(x)-PAGE_OFFSET)
cf4a81
 
cf4a81
-#define COMMAND_LINE_SIZE	512 /* from kernel */
cf4a81
-
cf4a81
 #ifdef CONFIG_BOOKE
cf4a81
 /* We don't need backup region in Book E */
cf4a81
 #define BACKUP_SRC_START	0x0000
cf4a81
diff --git a/kexec/arch/ppc/fs2dt.c b/kexec/arch/ppc/fs2dt.c
cf4a81
index 6e77379..fed499b 100644
cf4a81
--- a/kexec/arch/ppc/fs2dt.c
cf4a81
+++ b/kexec/arch/ppc/fs2dt.c
cf4a81
@@ -37,7 +37,6 @@
cf4a81
 #define TREEWORDS		65536	/* max 32 bit words for properties */
cf4a81
 #define MEMRESERVE		256	/* max number of reserved memory blks */
cf4a81
 #define MAX_MEMORY_RANGES	1024
cf4a81
-#define COMMAND_LINE_SIZE	512	/* from kernel */
cf4a81
 
cf4a81
 static char pathname[MAXPATH];
cf4a81
 static char propnames[NAMESPACE] = { 0 };
cf4a81
diff --git a/kexec/arch/ppc/kexec-ppc.h b/kexec/arch/ppc/kexec-ppc.h
cf4a81
index f8fd678..04e728e 100644
cf4a81
--- a/kexec/arch/ppc/kexec-ppc.h
cf4a81
+++ b/kexec/arch/ppc/kexec-ppc.h
cf4a81
@@ -6,6 +6,8 @@
cf4a81
 #define CORE_TYPE_ELF32	1
cf4a81
 #define CORE_TYPE_ELF64	2
cf4a81
 
cf4a81
+#define COMMAND_LINE_SIZE	2048 /* from kernel */
cf4a81
+
cf4a81
 extern unsigned char setup_simple_start[];
cf4a81
 extern uint32_t setup_simple_size;
cf4a81
 
cf4a81
@@ -76,7 +78,6 @@ extern int init_memory_region_info(void);
cf4a81
 extern int read_memory_region_limits(int fd, unsigned long long *start,
cf4a81
 					unsigned long long *end);
cf4a81
 extern int get_devtree_value(const char *fname, unsigned long long *pvalue);
cf4a81
-#define COMMAND_LINE_SIZE	512 /* from kernel */
cf4a81
 /*fs2dt*/
cf4a81
 void reserve(unsigned long long where, unsigned long long length);
cf4a81
 
cf4a81
diff --git a/kexec/arch/ppc/ops.h b/kexec/arch/ppc/ops.h
cf4a81
index 7334a05..5e7a070 100644
cf4a81
--- a/kexec/arch/ppc/ops.h
cf4a81
+++ b/kexec/arch/ppc/ops.h
cf4a81
@@ -12,7 +12,6 @@
cf4a81
 #define _PPC_BOOT_OPS_H_
cf4a81
 #include "types.h"
cf4a81
 
cf4a81
-#define	COMMAND_LINE_SIZE	512
cf4a81
 #define	MAX_PATH_LEN		256
cf4a81
 #define	MAX_PROP_LEN		256 /* What should this be? */
cf4a81
 
cf4a81
diff --git a/kexec/arch/ppc64/crashdump-ppc64.c b/kexec/arch/ppc64/crashdump-ppc64.c
cf4a81
index 5a71d51..13995bf 100644
cf4a81
--- a/kexec/arch/ppc64/crashdump-ppc64.c
cf4a81
+++ b/kexec/arch/ppc64/crashdump-ppc64.c
cf4a81
@@ -381,7 +381,7 @@ static void ultoa(uint64_t i, char *str)
cf4a81
 static int add_cmdline_param(char *cmdline, uint64_t addr, char *cmdstr,
cf4a81
 				char *byte)
cf4a81
 {
cf4a81
-	int cmdlen, len, align = 1024;
cf4a81
+	int cmdline_size, cmdlen, len, align = 1024;
cf4a81
 	char str[COMMAND_LINE_SIZE], *ptr;
cf4a81
 
cf4a81
 	/* Passing in =xxxK / =xxxM format. Saves space required in cmdline.*/
cf4a81
@@ -402,7 +402,9 @@ static int add_cmdline_param(char *cmdline, uint64_t addr, char *cmdstr,
cf4a81
 	strcat(str, byte);
cf4a81
 	len = strlen(str);
cf4a81
 	cmdlen = strlen(cmdline) + len;
cf4a81
-	if (cmdlen > (COMMAND_LINE_SIZE - 1))
cf4a81
+	cmdline_size = (kernel_version() < KERNEL_VERSION(3, 10, 0) ?
cf4a81
+			512 : COMMAND_LINE_SIZE);
cf4a81
+	if (cmdlen > (cmdline_size - 1))
cf4a81
 		die("Command line overflow\n");
cf4a81
 	strcat(cmdline, str);
cf4a81
 	dbgprintf("Command line after adding elfcorehdr: %s\n", cmdline);
cf4a81
diff --git a/kexec/arch/ppc64/crashdump-ppc64.h b/kexec/arch/ppc64/crashdump-ppc64.h
cf4a81
index d654c6b..42ccc31 100644
cf4a81
--- a/kexec/arch/ppc64/crashdump-ppc64.h
cf4a81
+++ b/kexec/arch/ppc64/crashdump-ppc64.h
cf4a81
@@ -16,7 +16,7 @@ void add_usable_mem_rgns(unsigned long long base, unsigned long long size);
cf4a81
 #define __pa(x)         ((unsigned long)(x)-PAGE_OFFSET)
cf4a81
 #define MAXMEM          (-KERNELBASE-VMALLOCBASE)
cf4a81
 
cf4a81
-#define COMMAND_LINE_SIZE       512 /* from kernel */
cf4a81
+#define COMMAND_LINE_SIZE       2048 /* from kernel */
cf4a81
 /* Backup Region, First 64K of System RAM. */
cf4a81
 #define BACKUP_SRC_START    0x0000
cf4a81
 #define BACKUP_SRC_END      0xffff
cf4a81
-- 
cf4a81
2.7.4
cf4a81