]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Check for protocols opened by vetoed driver and image handles
authorMichael Brown <mcb30@ipxe.org>
Fri, 23 Jun 2023 15:12:01 +0000 (16:12 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 23 Jun 2023 15:51:10 +0000 (16:51 +0100)
The UEFI specification states that the AgentHandle may be either the
driving binding protocol handle or the image handle.

Check for both handles when searching for stale handles to be forcibly
closed on behalf of a vetoed driver.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_veto.c

index 3e0806e019c98cc227a2acca75faad169384cee8..bc19a009157357b40934e48d465428d4bf7b7fb3 100644 (file)
@@ -205,6 +205,7 @@ static int efi_veto_close_protocol ( struct efi_veto *veto, EFI_HANDLE handle,
                                     EFI_GUID *protocol ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        EFI_HANDLE driver = veto->driver;
+       EFI_HANDLE image = veto->image;
        EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *openers;
        EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *opener;
        EFI_HANDLE controller;
@@ -227,8 +228,10 @@ static int efi_veto_close_protocol ( struct efi_veto *veto, EFI_HANDLE handle,
        /* Close anything opened by this driver */
        for ( i = 0 ; i < count ; i++ ) {
                opener = &openers[i];
-               if ( opener->AgentHandle != driver )
+               if ( ( opener->AgentHandle != driver ) &&
+                    ( opener->AgentHandle != image ) ) {
                        continue;
+               }
                controller = opener->ControllerHandle;
                DBGC_EFI_OPENER ( driver, handle, protocol, opener );
                if ( ( efirc = bs->CloseProtocol ( handle, protocol, driver,