[efi] Avoid infinite loops when asked to stop non-existent devices
authorMichael Brown <mcb30@ipxe.org>
Mon, 28 Sep 2015 01:54:53 +0000 (02:54 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 28 Sep 2015 02:20:59 +0000 (03:20 +0100)
commit9ff6d08bf53679f9b513501a5dcf8816cb79deb2
tree6bd84ab863e0cea3fed4dd265fc8f04495d7ec2a
parent7b976dd300c266c6f7e388b0dd65233cb9cb1ea5
[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>
src/interface/efi/efi_driver.c