]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Use efi_open_unsafe() for all explicitly unsafe protocol opens
authorMichael Brown <mcb30@ipxe.org>
Sun, 23 Mar 2025 19:38:14 +0000 (19:38 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 24 Mar 2025 13:19:26 +0000 (13:19 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/efi/nii.c
src/interface/efi/efi_bofm.c
src/interface/efi/efi_console.c
src/interface/efi/efi_init.c

index 18b292e5659d45ceab359f1e729ca5b39cfb5afc..126584effd2649a548881c46d4b0445134655b22 100644 (file)
@@ -230,12 +230,14 @@ static int nii_pci_open ( struct nii_nic *nii ) {
        }
        nii->pci_device = pci_device;
 
-       /* Open PCI I/O protocol */
-       if ( ( efirc = bs->OpenProtocol ( pci_device, &efi_pci_io_protocol_guid,
-                                         &pci_io.interface, efi_image_handle,
-                                         device,
-                                         EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
-               rc = -EEFI ( efirc );
+       /* Open PCI I/O protocol
+        *
+        * We cannot open this safely as a by-driver open, since doing
+        * so would disconnect the underlying NII driver.  We must
+        * therefore use an unsafe open.
+        */
+       if ( ( rc = efi_open_unsafe ( pci_device, &efi_pci_io_protocol_guid,
+                                     &pci_io.interface ) ) != 0 ) {
                DBGC ( nii, "NII %s could not open PCI I/O protocol: %s\n",
                       nii->dev.name, strerror ( rc ) );
                goto err_open;
@@ -280,8 +282,7 @@ static int nii_pci_open ( struct nii_nic *nii ) {
        return 0;
 
  err_get_bar_attributes:
-       bs->CloseProtocol ( pci_device, &efi_pci_io_protocol_guid,
-                           efi_image_handle, device );
+       efi_close_unsafe ( pci_device, &efi_pci_io_protocol_guid );
  err_open:
  err_locate:
        return rc;
@@ -294,7 +295,6 @@ static int nii_pci_open ( struct nii_nic *nii ) {
  * @ret rc             Return status code
  */
 static void nii_pci_close ( struct nii_nic *nii ) {
-       EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        struct nii_mapping *map;
        struct nii_mapping *tmp;
 
@@ -308,8 +308,7 @@ static void nii_pci_close ( struct nii_nic *nii ) {
        }
 
        /* Close protocols */
-       bs->CloseProtocol ( nii->pci_device, &efi_pci_io_protocol_guid,
-                           efi_image_handle, nii->efidev->device );
+       efi_close_unsafe ( nii->pci_device, &efi_pci_io_protocol_guid );
 }
 
 /**
index 1be68bf8b61157c8f3490d74acf68f8d50389754..6d97ff44588f890c5cecdce2dca03508c1bfa717 100644 (file)
@@ -241,10 +241,8 @@ static int efi_bofm_start ( struct efi_device *efidev ) {
        }
 
        /* Open PCI I/O protocol */
-       if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
-                                         &pci_io, efi_image_handle, device,
-                                         EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
-               rc = -EEFI ( efirc );
+       if ( ( rc = efi_open_unsafe ( device, &efi_pci_io_protocol_guid,
+                                     &pci_io ) ) != 0 ) {
                DBGC ( device, "EFIBOFM %s cannot open PCI device: %s\n",
                       efi_handle_name ( device ), strerror ( rc ) );
                goto err_open;
@@ -326,8 +324,7 @@ static int efi_bofm_start ( struct efi_device *efidev ) {
 
  err_set_status:
  err_locate_bofm:
-       bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
-                           efi_image_handle, device );
+       efi_close_unsafe ( device, &efi_pci_io_protocol_guid );
  err_open:
  err_info:
        return rc;
index 04bbd9e0c71712d755e812743b711203f7dfe8ab..41c4dcf2cd9115f4431cb1648a1e68c439b41500 100644 (file)
@@ -415,13 +415,11 @@ struct console_driver efi_console __console_driver = {
  *
  */
 static void efi_console_init ( void ) {
-       EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        EFI_CONSOLE_CONTROL_SCREEN_MODE mode;
        union {
                void *interface;
                EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *wtf;
        } u;
-       EFI_STATUS efirc;
        int rc;
 
        /* On some older EFI 1.10 implementations, we must use the
@@ -441,15 +439,12 @@ static void efi_console_init ( void ) {
         * apparently the expected behaviour for all UEFI
         * applications.  Don't ask.
         */
-       if ( ( efirc = bs->OpenProtocol ( efi_systab->ConsoleInHandle,
-                               &efi_simple_text_input_ex_protocol_guid,
-                               &u.interface, efi_image_handle,
-                               efi_systab->ConsoleInHandle,
-                               EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) == 0 ) {
+       if ( ( rc = efi_open_unsafe ( efi_systab->ConsoleInHandle,
+                                     &efi_simple_text_input_ex_protocol_guid,
+                                     &u.interface ) ) == 0 ) {
                efi_conin_ex = u.wtf;
                DBG ( "EFI using SimpleTextInputEx\n" );
        } else {
-               rc = -EEFI ( efirc );
                DBG ( "EFI has no SimpleTextInputEx: %s\n", strerror ( rc ) );
        }
 }
index d3c5042d747b0b42fb98e61d2e3e454b2b1a34c4..a45ee66a41e544c482cc3208f53a0f526b73222a 100644 (file)
@@ -241,14 +241,17 @@ EFI_STATUS efi_init ( EFI_HANDLE image_handle,
                }
        }
 
-       /* Get loaded image protocol */
-       if ( ( efirc = bs->OpenProtocol ( image_handle,
-                               &efi_loaded_image_protocol_guid,
-                               &loaded_image, image_handle, NULL,
-                               EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) != 0 ) {
-               rc = -EEFI ( efirc );
+       /* Get loaded image protocol
+        *
+        * We assume that our loaded image protocol will not be
+        * uninstalled while our image code is still running.
+        */
+       if ( ( rc = efi_open_unsafe ( image_handle,
+                                     &efi_loaded_image_protocol_guid,
+                                     &loaded_image ) ) != 0 ) {
                DBGC ( systab, "EFI could not get loaded image protocol: %s",
                       strerror ( rc ) );
+               efirc = EFIRC ( rc );
                goto err_no_loaded_image;
        }
        efi_loaded_image = loaded_image;