diff options
author | Wang YanQing <udknight@gmail.com> | 2013-04-08 17:23:25 +0800 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2013-04-17 09:10:16 +0900 |
commit | 030065eef1ef277211642e0b6ff46ff489ef6677 (patch) | |
tree | 2bf18b3b49c3d37694d494293242bdfe23d31e21 | |
parent | ac650465afb1a1721f6d5d9fb6f1d275b1a0c194 (diff) |
kexec:i386/kexec-[bzImage|elf-x86]:x86_64/kexec-bzImage64: Use "\0" as command line instead of empty command line
This patch prevents the problems to happen below:
In setup_linux_bootloader_parameters_high
120 cmdline_ptr = ((char *)real_mode) + cmdline_offset;
121 memcpy(cmdline_ptr, cmdline, cmdline_len);
122 cmdline_ptr[cmdline_len - 1] = '\0';
if cmdline_len == 0, Line 122 will corrupt kernel16 buf just before the commandline.
And in do_bzImage_load, for example,
369 cmdline_end = setup_base + kern16_size_needed + command_line_len - 1;
370 elf_rel_set_symbol(&info->rhdr, "cmdline_end", &cmdline_end,
371 sizeof(unsigned long));
Line 369 will go wrong, too.
Signed-off-by: Wang YanQing <udknight@gmail.com>
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-bzImage.c | 3 | ||||
-rw-r--r-- | kexec/arch/i386/kexec-elf-x86.c | 3 | ||||
-rw-r--r-- | kexec/arch/x86_64/kexec-bzImage64.c | 6 |
3 files changed, 11 insertions, 1 deletions
diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c index 39452a4..9680048 100644 --- a/kexec/arch/i386/kexec-bzImage.c +++ b/kexec/arch/i386/kexec-bzImage.c @@ -439,6 +439,9 @@ int bzImage_load(int argc, char **argv, const char *buf, off_t len, command_line_len = 0; if (command_line) { command_line_len = strlen(command_line) +1; + } else { + command_line = strdup("\0"); + command_line_len = 1; } ramdisk_buf = 0; if (ramdisk) { diff --git a/kexec/arch/i386/kexec-elf-x86.c b/kexec/arch/i386/kexec-elf-x86.c index 94571ca..9751a76 100644 --- a/kexec/arch/i386/kexec-elf-x86.c +++ b/kexec/arch/i386/kexec-elf-x86.c @@ -167,6 +167,9 @@ int elf_x86_load(int argc, char **argv, const char *buf, off_t len, command_line_len = 0; if (command_line) { command_line_len = strlen(command_line) +1; + } else { + command_line = strdup("\0"); + command_line_len = 1; } /* Need to append some command line parameters internally in case of diff --git a/kexec/arch/x86_64/kexec-bzImage64.c b/kexec/arch/x86_64/kexec-bzImage64.c index 21bc4ae..01bd9d9 100644 --- a/kexec/arch/x86_64/kexec-bzImage64.c +++ b/kexec/arch/x86_64/kexec-bzImage64.c @@ -286,8 +286,12 @@ int bzImage64_load(int argc, char **argv, const char *buf, off_t len, if (tmp_cmdline) free(tmp_cmdline); command_line_len = 0; - if (command_line) + if (command_line) { command_line_len = strlen(command_line) + 1; + } else { + command_line = strdup("\0"); + command_line_len = 1; + } ramdisk_buf = 0; if (ramdisk) ramdisk_buf = slurp_file(ramdisk, &ramdisk_length); |