From 1504bb0d96d7eac30cc5ed9b06ece0d40ae003f3 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 12 Jan 2019 14:42:40 +0100 Subject: [PATCH] efi_loader: clean up bootefi_test_prepare() Free resources upon failure. Correct the function description. As there is no need for any special address in the dummy memory device path passed via the EFI_LOADED_IMAGE_PROTOCOL simply use 0 as address. Signed-off-by: Heinrich Schuchardt --- cmd/bootefi.c | 58 +++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index e1eba463b8..3619a20e64 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -318,38 +318,46 @@ err_add_protocol: /** * bootefi_test_prepare() - prepare to run an EFI test * - * This sets things up so we can call EFI functions. This involves preparing - * the 'gd' pointer and setting up the load ed image data structures. + * Prepare to run a test as if it were provided by a loaded image. * - * @image_objp: loaded_image_infop: Pointer to a struct which will hold the - * loaded image object. This struct will be inited by this function before - * use. - * @loaded_image_infop: Pointer to a struct which will hold the loaded image - * info. This struct will be inited by this function before use. - * @path: File path to the test being run (often just the test name with a - * backslash before it - * @test_func: Address of the test function that is being run - * @load_options_path: U-Boot environment variable to use as load options - * @return 0 if OK, -ve on error + * @image_objp: pointer to be set to the loaded image handle + * @loaded_image_infop: pointer to be set to the loaded image protocol + * @path: dummy file path used to construct the device path + * set in the loaded image protocol + * @load_options_path: name of a U-Boot environment variable. Its value is + * set as load options in the loaded image protocol. + * Return: status code */ static efi_status_t bootefi_test_prepare (struct efi_loaded_image_obj **image_objp, - struct efi_loaded_image **loaded_image_infop, const char *path, - ulong test_func, const char *load_options_path) + struct efi_loaded_image **loaded_image_infop, const char *path, + const char *load_options_path) { + efi_status_t ret; + /* Construct a dummy device path */ - bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, - (uintptr_t)test_func, - (uintptr_t)test_func); + bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, 0, 0); if (!bootefi_device_path) return EFI_OUT_OF_RESOURCES; + bootefi_image_path = efi_dp_from_file(NULL, 0, path); - if (!bootefi_image_path) - return EFI_OUT_OF_RESOURCES; + if (!bootefi_image_path) { + ret = EFI_OUT_OF_RESOURCES; + goto failure; + } - return bootefi_run_prepare(load_options_path, bootefi_device_path, - bootefi_image_path, image_objp, - loaded_image_infop); + ret = bootefi_run_prepare(load_options_path, bootefi_device_path, + bootefi_image_path, image_objp, + loaded_image_infop); + if (ret == EFI_SUCCESS) + return ret; + + efi_free_pool(bootefi_image_path); + bootefi_image_path = NULL; +failure: + efi_free_pool(bootefi_device_path); + bootefi_device_path = NULL; + return ret; } #endif /* CONFIG_CMD_BOOTEFI_SELFTEST */ @@ -431,9 +439,9 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) struct efi_loaded_image_obj *image_obj; struct efi_loaded_image *loaded_image_info; - if (bootefi_test_prepare(&image_obj, &loaded_image_info, - "\\selftest", (uintptr_t)&efi_selftest, - "efi_selftest")) + r = bootefi_test_prepare(&image_obj, &loaded_image_info, + "\\selftest", "efi_selftest"); + if (r != EFI_SUCCESS) return CMD_RET_FAILURE; /* Execute the test */ -- 2.25.1