[PATCH 08/13] kexec: ppc: elf: fix memory leak caused by get_command_line

Zhang Yanfei zhangyanfei.yes at gmail.com
Mon Mar 25 11:13:40 EDT 2013


From: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>

Since get_command_line returns dynamically allocated memory, it is
easy for the caller to forget freeing the memory. Here fixes a
memory leak caused by this function.

Signed-off-by: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
---
 kexec/arch/ppc/kexec-elf-ppc.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
index 1eb3a62..694befb 100644
--- a/kexec/arch/ppc/kexec-elf-ppc.c
+++ b/kexec/arch/ppc/kexec-elf-ppc.c
@@ -156,6 +156,7 @@ int elf_ppc_load(int argc, char **argv,	const char *buf, off_t len,
 {
 	struct mem_ehdr ehdr;
 	char *command_line, *crash_cmdline, *cmdline_buf;
+	char *tmp_cmdline;
 	int command_line_len;
 	char *dtb;
 	int result;
@@ -191,7 +192,7 @@ int elf_ppc_load(int argc, char **argv,	const char *buf, off_t len,
 	char *blob_buf = NULL;
 	off_t blob_size = 0;
 
-	command_line = NULL;
+	command_line = tmp_cmdline = NULL;
 	dtb = NULL;
 	max_addr = LONG_MAX;
 	hole_addr = 0;
@@ -211,7 +212,7 @@ int elf_ppc_load(int argc, char **argv,	const char *buf, off_t len,
 			usage();
 			return -1;
 		case OPT_APPEND:
-			command_line = optarg;
+			tmp_cmdline = optarg;
 			break;
 		case OPT_RAMDISK:
 			ramdisk = optarg;
@@ -239,12 +240,12 @@ int elf_ppc_load(int argc, char **argv,	const char *buf, off_t len,
 		die("Can't specify --ramdisk or --initrd with --reuseinitrd\n");
 
 	command_line_len = 0;
-	if (command_line) {
-		command_line_len = strlen(command_line) + 1;
+	if (tmp_cmdline) {
+		command_line = tmp_cmdline;
 	} else {
 		command_line = get_command_line();
-		command_line_len = strlen(command_line) + 1;
 	}
+	command_line_len = strlen(command_line) + 1;
 
 	fixup_nodes[cur_fixup] = NULL;
 
@@ -450,6 +451,8 @@ out2:
 out:
 	free_elf_info(&ehdr);
 	free(crash_cmdline);
+	if (!tmp_cmdline)
+		free(command_line);
 	if (error_msg)
 		die(error_msg);
 
-- 
1.7.1




More information about the kexec mailing list