mirror of https://github.com/ipxe/ipxe.git
[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 <mcb30@ipxe.org>pull/41/head
parent
7b976dd300
commit
9ff6d08bf5
|
@ -254,7 +254,7 @@ efi_driver_stop ( EFI_DRIVER_BINDING_PROTOCOL *driver __unused,
|
||||||
if ( ! efidev ) {
|
if ( ! efidev ) {
|
||||||
DBGCP ( device, "EFIDRV %s is not started\n",
|
DBGCP ( device, "EFIDRV %s is not started\n",
|
||||||
efi_handle_name ( device ) );
|
efi_handle_name ( device ) );
|
||||||
return 0;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stop this device */
|
/* Stop this device */
|
||||||
|
|
Loading…
Reference in New Issue