From: Khalid Ali <[email protected]> Currently grub doesn't close used protocols, this causes internal firmware resource leak.
So make sure to close all protocols after usage. Signed-off-by: Khalid Ali <[email protected]> --- grub-core/commands/bli.c | 1 + grub-core/commands/efi/lsefi.c | 1 + grub-core/commands/efi/tpm.c | 5 +++-- grub-core/disk/efi/efidisk.c | 3 +++ grub-core/kern/efi/init.c | 1 + grub-core/loader/efi/appleloader.c | 2 +- grub-core/loader/efi/chainloader.c | 5 +++-- grub-core/loader/efi/linux.c | 1 + grub-core/net/drivers/efi/efinet.c | 6 ++++++ grub-core/term/efi/console.c | 2 +- grub-core/term/efi/serial.c | 1 + grub-core/video/efi_gop.c | 4 +++- 12 files changed, 25 insertions(+), 7 deletions(-) diff --git a/grub-core/commands/bli.c b/grub-core/commands/bli.c index 38f52f87a..fabfdb6a7 100644 --- a/grub-core/commands/bli.c +++ b/grub-core/commands/bli.c @@ -123,6 +123,7 @@ set_loader_device_part_uuid (void) else grub_error (status, N_("unable to determine partition UUID of boot device")); + grub_efi_close_loaded_image (grub_efi_image_handle); grub_free (part_uuid); grub_free (device_name); return status; diff --git a/grub-core/commands/efi/lsefi.c b/grub-core/commands/efi/lsefi.c index f4c10392d..c8d729507 100644 --- a/grub-core/commands/efi/lsefi.c +++ b/grub-core/commands/efi/lsefi.c @@ -127,6 +127,7 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)), grub_printf (" %pG\n", protocols[j]); } + grub_efi_close_device_path (handle); } grub_free (handles); diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c index 1c4906403..4b8214c9f 100644 --- a/grub-core/commands/efi/tpm.c +++ b/grub-core/commands/efi/tpm.c @@ -185,7 +185,7 @@ grub_tpm1_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf, status = tpm->log_extend_event (tpm, (grub_addr_t) buf, (grub_uint64_t) size, algorithm, event, &eventnum, &lastevent); grub_free (event); - + grub_efi_close_protocol (tpm_handle, &tpm_guid); return grub_efi_log_event_status (status); } @@ -221,7 +221,7 @@ grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf, status = tpm->hash_log_extend_event (tpm, 0, (grub_addr_t) buf, (grub_uint64_t) size, event); grub_free (event); - + grub_efi_close_protocol (tpm_handle, &tpm_guid); return grub_efi_log_event_status (status); } @@ -334,6 +334,7 @@ grub_tpm_present (void) } return grub_tpm2_present (tpm); } + } grub_uint32_t diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c index 3b5ed5691..837606322 100644 --- a/grub-core/disk/efi/efidisk.c +++ b/grub-core/disk/efi/efidisk.c @@ -109,6 +109,7 @@ make_devices (void) d->block_io = bio; d->next = devices; devices = d; + grub_efi_close_protocol (*handle, &block_io_guid); } grub_free (handles); @@ -908,5 +909,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) /* This may be guessed device - floppy, cdrom or entire disk. */ if (!get_diskname_from_path (dp, device_name)) return 0; + + grub_efi_close_device_path (handle); return grub_strdup (device_name); } diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c index 1637077e1..7e86ea77c 100644 --- a/grub-core/kern/efi/init.c +++ b/grub-core/kern/efi/init.c @@ -150,6 +150,7 @@ grub_machine_get_bootlocation (char **device, char **path) if (p) *p = '\0'; } + grub_efi_close_loaded_image (grub_efi_image_handle); } void diff --git a/grub-core/loader/efi/appleloader.c b/grub-core/loader/efi/appleloader.c index a0b61a240..256348d62 100644 --- a/grub-core/loader/efi/appleloader.c +++ b/grub-core/loader/efi/appleloader.c @@ -214,7 +214,7 @@ grub_cmd_appleloader (grub_command_t cmd __attribute__ ((unused)), } grub_loader_set (grub_appleloader_boot, grub_appleloader_unload, 0); - + grub_efi_close_loaded_image (image_handle); return 0; fail: diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c index e77bd863c..561360022 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c @@ -57,7 +57,7 @@ grub_chainloader_unload (void *context) grub_free (loaded_image->load_options); grub_efi_unload_image (image_handle); - + grub_efi_close_loaded_image (image_handle); grub_dl_unref (my_mod); return GRUB_ERR_NONE; } @@ -397,7 +397,8 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), grub_file_close (file); grub_device_close (dev); - + grub_efi_close_loaded_image (image_handle); + grub_efi_close_device_path (dev_handle); /* We're finished with the source image buffer and file path now. */ b->free_pages (address, pages); grub_free (file_path); diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c index ded507cd5..66f320fd3 100644 --- a/grub-core/loader/efi/linux.c +++ b/grub-core/loader/efi/linux.c @@ -256,6 +256,7 @@ grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) status = grub_efi_start_image (image_handle, 0, NULL); /* When successful, not reached */ + grub_efi_close_loaded_image (image_handle); grub_error (GRUB_ERR_BAD_OS, "start_image() returned 0x%" PRIxGRUB_EFI_UINTN_T, status); grub_efi_free_pages ((grub_addr_t) loaded_image->load_options, GRUB_EFI_BYTES_TO_PAGES (len)); diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index 58fe381ab..d95691c6d 100644 --- a/grub-core/net/drivers/efi/efinet.c +++ b/grub-core/net/drivers/efi/efinet.c @@ -210,6 +210,7 @@ open_card (struct grub_net_card *dev) dev->name); } + grub_efi_close_protocol (dev->efi_handle, &net_io_guid); return GRUB_ERR_NONE; } @@ -338,6 +339,8 @@ grub_efinet_findcards (void) card->efi_handle = *handle; grub_net_card_register (card); + grub_efi_close_protocol (*handle, &net_io_guid); + grub_efi_close_device_path (*handle); } grub_free (handles); } @@ -438,6 +441,9 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device, vlan_dp = (grub_efi_device_path_t *) ((grub_efi_uint8_t *) vlan_dp + vlan_dp_len); } } + grub_efi_close_protocol (hnd, &pxe_io_guid); + grub_efi_close_device_path (dp); + grub_efi_close_device_path (cdp); return; } } diff --git a/grub-core/term/efi/console.c b/grub-core/term/efi/console.c index 37c4e5113..d2add929a 100644 --- a/grub-core/term/efi/console.c +++ b/grub-core/term/efi/console.c @@ -369,7 +369,7 @@ grub_efi_console_input_init (struct grub_term_input *term) &text_input_ex_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); term->data = (void *)text_input; - + grub_efi_close_protocol (grub_efi_system_table->console_in_handler, &text_input_ex_guid); return 0; } diff --git a/grub-core/term/efi/serial.c b/grub-core/term/efi/serial.c index e409b8d5e..bb7ace46f 100644 --- a/grub-core/term/efi/serial.c +++ b/grub-core/term/efi/serial.c @@ -187,6 +187,7 @@ grub_efiserial_init (void) grub_print_error (); grub_serial_register (port); + grub_efi_close_protocol (*handle, &serial_io_guid); } grub_free (handles); diff --git a/grub-core/video/efi_gop.c b/grub-core/video/efi_gop.c index 1ad2e709d..f03a5be8b 100644 --- a/grub-core/video/efi_gop.c +++ b/grub-core/video/efi_gop.c @@ -94,6 +94,7 @@ check_protocol (void) gop_handle = 0; grub_dprintf ("video", "GOP: no usable mode\n"); + grub_efi_close_protocol (gop_handle, &graphics_output_guid); grub_free (handles); return 0; } @@ -325,7 +326,8 @@ grub_video_gop_get_edid (struct grub_video_edid_info *edid_info) if (copy_size > sizeof (*edid_info)) copy_size = sizeof (*edid_info); grub_memcpy (edid_info, edid->edid, copy_size); - + grub_efi_close_protocol (gop_handle, &active_edid_guid); + grub_efi_close_protocol (gop_handle, &discovered_edid_guid); return GRUB_ERR_NONE; } -- 2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
