cmd: replace efi_create_handle/add_protocol with InstallMultipleProtocol

In general handles should only be deleted if the last remaining protocol
is removed.  Instead of explicitly calling
efi_create_handle -> efi_add_protocol -> efi_delete_handle which blindly
removes all protocols from a handle before removing it,  use
InstallMultiple/UninstallMultiple which adheres to the EFI spec and only
deletes a handle if there are no additional protocols present

Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Ilias Apalodimas
2022-10-06 16:08:44 +03:00
committed by Heinrich Schuchardt
parent 05c4c9e21a
commit a75e8355ea

View File

@@ -492,7 +492,7 @@ efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
efi_handle_t mem_handle = NULL, handle; efi_handle_t mem_handle = NULL, handle;
struct efi_device_path *file_path = NULL; struct efi_device_path *file_path = NULL;
struct efi_device_path *msg_path; struct efi_device_path *msg_path;
efi_status_t ret; efi_status_t ret, ret2;
u16 *load_options; u16 *load_options;
if (!bootefi_device_path || !bootefi_image_path) { if (!bootefi_device_path || !bootefi_image_path) {
@@ -509,12 +509,9 @@ efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
* Make sure that device for device_path exist * Make sure that device for device_path exist
* in load_image(). Otherwise, shell and grub will fail. * in load_image(). Otherwise, shell and grub will fail.
*/ */
ret = efi_create_handle(&mem_handle); ret = efi_install_multiple_protocol_interfaces(&mem_handle,
if (ret != EFI_SUCCESS) &efi_guid_device_path,
goto out; file_path, NULL);
ret = efi_add_protocol(mem_handle, &efi_guid_device_path,
file_path);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
msg_path = file_path; msg_path = file_path;
@@ -542,9 +539,11 @@ efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
ret = do_bootefi_exec(handle, load_options); ret = do_bootefi_exec(handle, load_options);
out: out:
efi_delete_handle(mem_handle); ret2 = efi_uninstall_multiple_protocol_interfaces(mem_handle,
&efi_guid_device_path,
file_path, NULL);
efi_free_pool(file_path); efi_free_pool(file_path);
return ret; return (ret != EFI_SUCCESS) ? ret : ret2;
} }
#ifdef CONFIG_CMD_BOOTEFI_SELFTEST #ifdef CONFIG_CMD_BOOTEFI_SELFTEST