diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2012-03-05 13:06:14 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-03-16 16:03:24 -0400 |
commit | c7b738351ba92f48b943ac59aff6b5b0f17f37c9 (patch) | |
tree | 73b819862466ed2fcb4f68466d056b770a0a49e4 /arch/x86/boot | |
parent | 73d63d038ee9f769f5e5b46792d227fe20e442c5 (diff) |
x86, efi: Fix pointer math issue in handle_ramdisks()
"filename" is a efi_char16_t string so this check for reaching the end
of the array doesn't work. We need to cast the pointer to (u8 *) before
doing the math.
This patch changes the "filename" to "filename_16" to avoid confusion in
the future.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Link: http://lkml.kernel.org/r/20120305180614.GA26880@elgon.mountain
Acked-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/compressed/eboot.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index fec216f4fbc3..0cdfc0d2315e 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -539,7 +539,7 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image, | |||
539 | struct initrd *initrd; | 539 | struct initrd *initrd; |
540 | efi_file_handle_t *h; | 540 | efi_file_handle_t *h; |
541 | efi_file_info_t *info; | 541 | efi_file_info_t *info; |
542 | efi_char16_t filename[256]; | 542 | efi_char16_t filename_16[256]; |
543 | unsigned long info_sz; | 543 | unsigned long info_sz; |
544 | efi_guid_t info_guid = EFI_FILE_INFO_ID; | 544 | efi_guid_t info_guid = EFI_FILE_INFO_ID; |
545 | efi_char16_t *p; | 545 | efi_char16_t *p; |
@@ -552,14 +552,14 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image, | |||
552 | str += 7; | 552 | str += 7; |
553 | 553 | ||
554 | initrd = &initrds[i]; | 554 | initrd = &initrds[i]; |
555 | p = filename; | 555 | p = filename_16; |
556 | 556 | ||
557 | /* Skip any leading slashes */ | 557 | /* Skip any leading slashes */ |
558 | while (*str == '/' || *str == '\\') | 558 | while (*str == '/' || *str == '\\') |
559 | str++; | 559 | str++; |
560 | 560 | ||
561 | while (*str && *str != ' ' && *str != '\n') { | 561 | while (*str && *str != ' ' && *str != '\n') { |
562 | if (p >= filename + sizeof(filename)) | 562 | if ((u8 *)p >= (u8 *)filename_16 + sizeof(filename_16)) |
563 | break; | 563 | break; |
564 | 564 | ||
565 | *p++ = *str++; | 565 | *p++ = *str++; |
@@ -583,7 +583,7 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image, | |||
583 | goto free_initrds; | 583 | goto free_initrds; |
584 | } | 584 | } |
585 | 585 | ||
586 | status = efi_call_phys5(fh->open, fh, &h, filename, | 586 | status = efi_call_phys5(fh->open, fh, &h, filename_16, |
587 | EFI_FILE_MODE_READ, (u64)0); | 587 | EFI_FILE_MODE_READ, (u64)0); |
588 | if (status != EFI_SUCCESS) | 588 | if (status != EFI_SUCCESS) |
589 | goto close_handles; | 589 | goto close_handles; |