From 9ff6d08bf53679f9b513501a5dcf8816cb79deb2 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 28 Sep 2015 02:54:53 +0100 Subject: [PATCH] [efi] Avoid infinite loops when asked to stop non-existent devices Calling EDK2's OpenProtocol() with attributes BY_DRIVER|EXCLUSIVE will call DisconnectController() in a loop to attempt to dislodge any existing openers with attributes BY_DRIVER. The loop will continue indefinitely until either no such openers remain, or until DisconnectController() returns an error. If our driver binding protocol's Stop() method is ever called to disconnect a device that we are not in fact driving, then return EFI_DEVICE_ERROR rather than EFI_SUCCESS, in order to break this potentially infinite loop. Signed-off-by: Michael Brown --- src/interface/efi/efi_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/efi/efi_driver.c b/src/interface/efi/efi_driver.c index ec67bbcdf..22aa3ee72 100644 --- a/src/interface/efi/efi_driver.c +++ b/src/interface/efi/efi_driver.c @@ -254,7 +254,7 @@ efi_driver_stop ( EFI_DRIVER_BINDING_PROTOCOL *driver __unused, if ( ! efidev ) { DBGCP ( device, "EFIDRV %s is not started\n", efi_handle_name ( device ) ); - return 0; + return EFI_DEVICE_ERROR; } /* Stop this device */