From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Leo Sandoval Date: Wed, 29 May 2024 17:35:35 -0600 Subject: [PATCH] loader/efi/linux.c: read the kernel image before header Signed-off-by: Leo Sandoval --- grub-core/loader/efi/linux.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c index d9ded7c4f12..3ada50ed969 100644 --- a/grub-core/loader/efi/linux.c +++ b/grub-core/loader/efi/linux.c @@ -559,6 +559,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_file_t file = 0; struct linux_arch_kernel_header lh; grub_off_t filelen; + grub_off_t filereadlen; grub_uint32_t align; grub_uint32_t code_size; void *kernel = NULL; @@ -592,6 +593,25 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), if (!file) goto fail; + filelen = grub_file_size (file); + kernel = grub_malloc(filelen); + if (!kernel) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel load buffer")); + goto fail; + } + + filereadlen = grub_file_read (file, kernel, filelen); + grub_dprintf ("linux", "filelen : %lld\n", (long long) filelen); + grub_dprintf ("linux", "filereadlen : %lld\n", (long long) filereadlen); + + if (filereadlen < filelen) + { + grub_error (GRUB_ERR_FILE_READ_ERROR, N_("Can't read kernel %s"), + argv[0]); + goto fail; + } + if (grub_arch_efi_linux_load_image_header (file, &lh) != GRUB_ERR_NONE) #if !defined(__i386__) && !defined(__x86_64__) goto fail; @@ -612,20 +632,6 @@ fallback: } #endif - filelen = grub_file_size (file); - kernel = grub_malloc(filelen); - if (!kernel) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel load buffer")); - goto fail; - } - - if (grub_file_read (file, kernel, filelen) < (grub_ssize_t)filelen) - { - grub_error (GRUB_ERR_FILE_READ_ERROR, N_("Can't read kernel %s"), - argv[0]); - goto fail; - } #if !defined(__i386__) && !defined(__x86_64__) if (parse_pe_header (kernel, &kernel_size, &handover_offset, &align, &code_size) != GRUB_ERR_NONE)