diff options
author | Zhang Yanfei <zhangyanfei@cn.fujitsu.com> | 2013-03-25 23:07:49 +0800 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2013-03-27 21:36:30 +0900 |
commit | 40e7f33864a9090dceef798cc856bf38f72ca15b (patch) | |
tree | 8f0eb594ad78f2623546a35d1243e5abc08cee94 | |
parent | 40a58f38fd23b2c96c5b0564d09c61ec6ff41a99 (diff) | |
download | kexec-tools-40e7f33864a9090dceef798cc856bf38f72ca15b.tar.gz |
kexec: i386: elf: fix possible memory leak in elf_x86_load
In elf_x86_load, allocated memory may not be free'd if the code
exits abnormally, by calling die() or return. So the patch fixes
the possible memory leak.
This patch is also a preparation for patch04.
Signed-off-by: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/arch/i386/kexec-elf-x86.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/kexec/arch/i386/kexec-elf-x86.c b/kexec/arch/i386/kexec-elf-x86.c index e62ebcba..de855c46 100644 --- a/kexec/arch/i386/kexec-elf-x86.c +++ b/kexec/arch/i386/kexec-elf-x86.c @@ -90,6 +90,8 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, struct mem_ehdr ehdr; char *command_line = NULL, *modified_cmdline = NULL; const char *append = NULL; + char *error_msg = NULL; + int result; int command_line_len; int modified_cmdline_len; const char *ramdisk; @@ -120,9 +122,9 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, * Parse the command line arguments */ arg_style = ARG_STYLE_ELF; - modified_cmdline = 0; modified_cmdline_len = 0; ramdisk = 0; + result = 0; while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1) { switch(opt) { default: @@ -215,7 +217,8 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, elf_rel_set_symbol(&info->rhdr, "entry32_regs", ®s, sizeof(regs)); if (ramdisk) { - die("Ramdisks not supported with generic elf arguments"); + error_msg = "Ramdisks not supported with generic elf arguments"; + goto out; } } else if (arg_style == ARG_STYLE_LINUX) { @@ -256,8 +259,10 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, if (info->kexec_flags & (KEXEC_ON_CRASH|KEXEC_PRESERVE_CONTEXT)) { rc = load_crashdump_segments(info, modified_cmdline, max_addr, 0); - if (rc < 0) - return -1; + if (rc < 0) { + result = -1; + goto out; + } /* Use new command line. */ free(command_line); command_line = modified_cmdline; @@ -283,10 +288,13 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, elf_rel_set_symbol(&info->rhdr, "entry32_regs", ®s, sizeof(regs)); } else { - die("Unknown argument style\n"); + error_msg = "Unknown argument style\n"; } +out: free(command_line); free(modified_cmdline); - return 0; + if (error_msg) + die(error_msg); + return result; } |