[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