summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWang YanQing <udknight@gmail.com>2013-04-08 17:23:25 +0800
committerSimon Horman <horms@verge.net.au>2013-04-17 09:10:16 +0900
commit030065eef1ef277211642e0b6ff46ff489ef6677 (patch)
tree2bf18b3b49c3d37694d494293242bdfe23d31e21
parentac650465afb1a1721f6d5d9fb6f1d275b1a0c194 (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.c3
-rw-r--r--kexec/arch/i386/kexec-elf-x86.c3
-rw-r--r--kexec/arch/x86_64/kexec-bzImage64.c6
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);