[PATCH v2 1/1] lib: efi_loader: don't delete invalid handles

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Thu Sep 8 08:54:01 CEST 2022



On 9/8/22 08:46, Ilias Apalodimas wrote:
> Hi all,
> 
> On Thu, 8 Sept 2022 at 09:18, Heinrich Schuchardt
> <heinrich.schuchardt at canonical.com> wrote:
>>
>> From: Etienne Carriere <etienne.carriere at linaro.org>
>>
>> From: Etienne Carriere <etienne.carriere at linaro.org>
>>
>> Change efi_delete_handle() to not free EFI handles twice.
>>
>> This change tries to resolved an issue seen since U-Boot v2022.07
>> in which ExitBootService() attempts to release some EFI handles twice.
>>
>> The issue was seen booting a EFI shell that invokes 'connect -r' and
>> then boots a Linux kernel. Execution of connect command makes EFI
>> subsystem to bind a block device for each root block devices EFI handles.
>> However these EFI device handles are already bound to a driver and we
>> can have 2 registered devices relating to the same EFI handler. On
>> ExitBootService(), the loop removing the devices makes these EFI handles
>> to be released twice which corrupts memory.
>>
>> This patch prevents the memory release operation caused by the issue but
>> but does not resolve the underlying problem.
>>
>> Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
>>
>> Add log message.
>> Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>> ---
>> v2:
>>          add log message
>>          remove superfluous NULL test
>>          tweak commit message
>> ---
>>   lib/efi_loader/efi_boottime.c | 9 +++++++--
>>   1 file changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
>> index 4da64b5d29..6f7333638a 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -619,9 +619,14 @@ efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
>>    */
>>   void efi_delete_handle(efi_handle_t handle)
>>   {
>> -       if (!handle)
>> +       efi_status_t ret;
>> +
>> +       ret = efi_remove_all_protocols(handle);
>> +       if (ret == EFI_INVALID_PARAMETER) {
>> +               log_err("Can't remove invalid handle %p\n", handle);
>>                  return;
>> -       efi_remove_all_protocols(handle);
>> +       }
>> +
>>          list_del(&handle->link);
>>          free(handle);
> 
> Can't we just set the handle NULL here?


If you set handle=NULL in  efi_delete_handle(), this has no effect as 
the caller passes in handle and not *handle.

Best regards

Heinrich


More information about the U-Boot mailing list