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

Reply via email to