[U-Boot] [PATCH 1/1] efi_loader: close protocols in UnloadImage()

When UnloadImage() is called all protocols opened by the image have to be closed.
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de --- lib/efi_loader/efi_boottime.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 5714deca70..f4e3186ffc 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -2873,12 +2873,41 @@ efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, * @image_obj: handle of the loaded image * @loaded_image_protocol: loaded image protocol */ -static void efi_delete_image(struct efi_loaded_image_obj *image_obj, - struct efi_loaded_image *loaded_image_protocol) -{ +static efi_status_t efi_delete_image + (struct efi_loaded_image_obj *image_obj, + struct efi_loaded_image *loaded_image_protocol) +{ + struct efi_object *efiobj, *posobj; + efi_status_t r, ret = EFI_SUCCESS; + + list_for_each_entry_safe(efiobj, posobj, &efi_obj_list, link) { + struct efi_handler *prot, *protpos; + + list_for_each_entry_safe(prot, protpos, &efiobj->protocols, + link) { + struct efi_open_protocol_info_item *info, *infopos; + + list_for_each_entry_safe(info, infopos, + &prot->open_infos, link) { + if (info->info.agent_handle != + (efi_handle_t)image_obj) + continue; + r = EFI_CALL(efi_close_protocol + (efiobj, prot->guid, + info->info.agent_handle, + info->info.controller_handle + )); + if (r != EFI_SUCCESS) + ret = r; + } + } + } + efi_free_pages((uintptr_t)loaded_image_protocol->image_base, efi_size_in_pages(loaded_image_protocol->image_size)); efi_delete_handle(&image_obj->header); + + return ret; }
/** -- 2.20.1
participants (1)
-
Heinrich Schuchardt