[PATCH 05/13] kexec: i386: multiboot: fix possible memory leak in multiboot_x86_load
Zhang Yanfei
zhangyanfei.yes at gmail.com
Mon Mar 25 11:10:35 EDT 2013
From: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
In multiboot_x86_load, allocated memory may not be free'd if the code
exits abnormally, by calling return. So the patch fixes the possible
memory leak.
Besides, remove some extra blank lines.
Signed-off-by: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
---
kexec/arch/i386/kexec-multiboot-x86.c | 16 ++++++----------
1 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/kexec/arch/i386/kexec-multiboot-x86.c b/kexec/arch/i386/kexec-multiboot-x86.c
index 3f787e1..4252f75 100644
--- a/kexec/arch/i386/kexec-multiboot-x86.c
+++ b/kexec/arch/i386/kexec-multiboot-x86.c
@@ -153,7 +153,7 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
int ranges;
struct AddrRangeDesc *mmap;
int command_line_len;
- int i;
+ int i, result;
uint32_t u;
int opt;
int modules, mod_command_line_space;
@@ -174,13 +174,12 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
fprintf(stderr, "Cannot find a loadable multiboot header.\n");
return -1;
}
-
/* Parse the command line */
- command_line = "";
command_line_len = 0;
modules = 0;
mod_command_line_space = 0;
+ result = 0;
while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1)
{
switch(opt) {
@@ -207,8 +206,6 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
imagename = argv[optind];
command_line = concat_cmdline(command_line, append);
command_line_len = strlen(command_line) + strlen(imagename) + 2;
-
-
/* Load the ELF executable */
elf_exec_build_load(info, &ehdr, buf, len, 0);
@@ -274,7 +271,6 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
mmap[i].Type = 0xbad; /* Not RAM */
}
-
if (mbh->flags & MULTIBOOT_MEMORY_INFO) {
/* Provide a copy of the memory map to the kernel */
@@ -295,7 +291,6 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
/* done */
}
-
/* Load modules */
if (modules) {
char *mod_filename, *mod_command_line, *mod_clp, *buf;
@@ -358,10 +353,10 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
}
-
/* Find a place for the MBI to live */
if (sort_segments(info) < 0) {
- return -1;
+ result = -1;
+ goto out;
}
mbi_base = add_buffer(info,
mbi_buf, mbi_bytes, mbi_bytes, 4, 0, 0xFFFFFFFFUL, 1);
@@ -383,8 +378,9 @@ int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
regs.eip = ehdr.e_entry;
elf_rel_set_symbol(&info->rhdr, "entry32_regs", ®s, sizeof(regs));
+out:
free(command_line);
- return 0;
+ return result;
}
/*
--
1.7.1
More information about the kexec
mailing list