grub2/0263-loader-efi-linux.c-read-the-kernel-image-before-head.patch

70 lines
2.2 KiB
Diff
Raw Permalink Normal View History

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Leo Sandoval <lsandova@redhat.com>
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 <lsandova@redhat.com>
---
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)