[PATCH 03/13] kexec: i386: elf: fix possible memory leak in elf_x86_load
Zhang Yanfei
zhangyanfei.yes at gmail.com
Mon Mar 25 11:07:49 EDT 2013
From: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
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 at cn.fujitsu.com>
---
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 e62ebcb..de855c4 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;
}
--
1.7.1
More information about the kexec
mailing list