|
@@ -263,6 +263,7 @@ static efi_status_t do_bootefi_exec(void *efi,
|
|
|
{
|
|
|
struct efi_loaded_image loaded_image_info = {};
|
|
|
struct efi_object loaded_image_info_obj = {};
|
|
|
+ struct efi_object mem_obj = {};
|
|
|
struct efi_device_path *memdp = NULL;
|
|
|
efi_status_t ret;
|
|
|
|
|
@@ -279,6 +280,12 @@ static efi_status_t do_bootefi_exec(void *efi,
|
|
|
/* actual addresses filled in after efi_load_pe() */
|
|
|
memdp = efi_dp_from_mem(0, 0, 0);
|
|
|
device_path = image_path = memdp;
|
|
|
+ efi_add_handle(&mem_obj);
|
|
|
+
|
|
|
+ ret = efi_add_protocol(mem_obj.handle, &efi_guid_device_path,
|
|
|
+ device_path);
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto exit;
|
|
|
} else {
|
|
|
assert(device_path && image_path);
|
|
|
}
|
|
@@ -343,6 +350,8 @@ static efi_status_t do_bootefi_exec(void *efi,
|
|
|
exit:
|
|
|
/* image has returned, loaded-image obj goes *poof*: */
|
|
|
list_del(&loaded_image_info_obj.link);
|
|
|
+ if (mem_obj.handle)
|
|
|
+ list_del(&mem_obj.link);
|
|
|
|
|
|
return ret;
|
|
|
}
|