From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Chris Coulson Date: Thu, 28 Apr 2022 21:53:36 +0100 Subject: [PATCH] loader/efi/chainloader: grub_load_and_start_image doesn't load and start grub_load_and_start_image only loads an image - it still requires the caller to start it. This renames it to grub_load_image. It's called from 2 places: - grub_cmd_chainloader when not using the shim protocol. - grub_secureboot_chainloader_boot if handle_image returns an error. In this case, the image is loaded and then nothing else happens which seems strange. I assume the intention is that it falls back to LoadImage and StartImage if handle_image fails, so I've made it do that. Signed-off-by: Chris Coulson (cherry picked from commit b4d70820a65c00561045856b7b8355461a9545f6) (cherry picked from commit 05b16a6be50b1910609740a66b561276fa490538) (cherry picked from commit 16486a34f3aa41a94e334e86db1a1e21e9b0a45f) (cherry picked from commit 0bbd693019567b2c55e8be121378d4875f44369a) [rharwood: chainloader handle_image casting] --- grub-core/loader/efi/chainloader.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c index 001766bdf6..eeef52acde 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c @@ -840,7 +840,7 @@ grub_secureboot_chainloader_unload (void) } static grub_err_t -grub_load_and_start_image(void *boot_image) +grub_load_image(void *boot_image) { grub_efi_boot_services_t *b; grub_efi_status_t status; @@ -882,13 +882,23 @@ grub_load_and_start_image(void *boot_image) static grub_err_t grub_secureboot_chainloader_boot (void) { + grub_efi_boot_services_t *b; int rc; - rc = handle_image ((void *)address, fsize); + + rc = handle_image ((void *)(unsigned long)address, fsize); if (rc == 0) { - grub_load_and_start_image((void *)address); + /* We weren't able to attempt to execute the image, so fall back + * to LoadImage / StartImage. + */ + rc = grub_load_image((void *)(unsigned long)address); + if (rc == 0) + grub_chainloader_boot (); } + b = grub_efi_system_table->boot_services; + efi_call_1 (b->unload_image, image_handle); + grub_loader_unset (); return grub_errno; } @@ -1076,7 +1086,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), } else if (rc == 0) { - grub_load_and_start_image(boot_image); + grub_load_image(boot_image); grub_file_close (file); grub_loader_set (grub_chainloader_boot, grub_chainloader_unload, 0);