[PATCH v2 1/1] lib: efi_loader: don't delete invalid handles
Ilias Apalodimas
ilias.apalodimas at linaro.org
Thu Sep 8 08:54:59 CEST 2022
hi Heinrich
On Thu, 8 Sept 2022 at 09:54, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
>
>
> 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.
Yea you are right
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
>
> Best regards
>
> Heinrich
More information about the U-Boot
mailing list