summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhang Yanfei <zhangyanfei@cn.fujitsu.com>2013-03-25 23:07:49 +0800
committerSimon Horman <horms@verge.net.au>2013-03-27 21:36:30 +0900
commit40e7f33864a9090dceef798cc856bf38f72ca15b (patch)
tree8f0eb594ad78f2623546a35d1243e5abc08cee94
parent40a58f38fd23b2c96c5b0564d09c61ec6ff41a99 (diff)
downloadkexec-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.c20
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", &regs, 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", &regs, 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;
}