[PATCH] efi_loader: delete handle from events when a protocol is uninstalled

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Aug 24 16:02:51 CEST 2023


On 24.08.23 15:06, Ilias Apalodimas wrote:
> Hi Henrich
>
>
>>>
>>> +/**
>>> + * efi_purge_handle() - Clean the deleted handle from the various lists
>>> + * @handle: handle to remove
>>> + *
>>> + * Return: status code
>>> + */
>>> +static efi_status_t efi_purge_handle(efi_handle_t handle)
>>> +{
>>> +     struct efi_register_notify_event *item, *next;
>>> +
>>> +     if (!list_empty(&handle->protocols))
>>> +             return EFI_ACCESS_DENIED;
>>> +     /* The handle is about to be freed. Remove it from events */
>>> +     list_for_each_entry_safe(item, next, &efi_register_notify_events, link) {
>>
>> You are not deleting from efi_register_notify_events.
>
> I am not sure I understand this.  I am not trying to delete the event
> here, but the handle on which the notified protocol was installed.
>
>>   Why do you use the safe version of the iterator?
>
> No particular reason, I just tend to prefer it over the unsafe one.
> The latter is perfectly fine here.

The save version is only needed if you delete the current item or insert
in the current position.

>
> [...]
>
>>>
>>> -     /* If the last protocol has been removed, delete the handle. */
>>> -     if (list_empty(&handle->protocols)) {
>>
>>>        size_t i = 0;
>>> @@ -2795,25 +2827,25 @@ efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle,
>>>                return EFI_INVALID_PARAMETER;
>>>
>>>        efi_va_copy(argptr_copy, argptr);
>>> +     protocol = efi_va_arg(argptr, efi_guid_t*);
>>>        for (;;) {
>>> -             protocol = efi_va_arg(argptr, efi_guid_t*);
>>> +             bool preserve = true;
>>> +
>>>                if (!protocol)
>>>                        break;
>>>                protocol_interface = efi_va_arg(argptr, void*);
>>> +             next_protocol = efi_va_arg(argptr, efi_guid_t*);
>>> +             if (!next_protocol)
>>> +                     preserve = false;
>>
>> Is your idea that if 5 protocols are to be removed but only the first 3
>> are installed your want to reinstall the first 3?
>
> Not only that. Image you install 2 protocols and then someone tries to
> uninstall 3. If the invalid guid/protocol is at the beginning or the
> middle of the list you'll be fine.  The current code will reinstall
> the previously removed protocols.
> However, if the invalid protocol is last, you will have removed 2
> valid protocols and the handle will be empty.  In that case, we will
> delete the handle before trying to reinstall the uninstalled
> protocols.

This is just what I meant.

Best regards

Heirnich

>
>>
>> Can we have some code comment describing what the function should do? In
>> 5 years nobody will remember why the code was implemented this way.
>>
>
> Of course
>
> [...]
>
> Cheers
> /Ilias



More information about the U-Boot mailing list