[U-Boot] [PATCH v2 1/1] efi_loader: LoadImage() parameter checks
Graf, Alexander
graf at amazon.com
Mon May 6 07:24:56 UTC 2019
On 06.05.19 07:42, Heinrich Schuchardt wrote:
> If the file path is NULL, return EFI_INVALID_PARAMETER.
> If the file path is invalid, return EFI_NOT_FOUND.
These 2 are a documented inEFI_LOAD_FILE_PROTOCOL.LoadFile(). It might
be a good idea to indicate that for later reference.
> If the size of the source buffer is 0, return EFI_LOAD_ERROR.
The spec says this should be EFI_INVALID_PARAMETER, no? Is this a spec
or an SCT bug?
> If the parent image handle does not refer to a loaded image return
> EFI_INVALID_PARAMETER.
I agree that this is a good change, but where is the spec reference? I
couldn't find anything.
>
> The change is required to reach UEFI SCT conformance.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
IMHO this really should be a patch set with multiple individual changes,
each changing one piece of spec conformance at a time.
That way if we happen to break anything along the way, bisecting would
point us to exactly the right point where things fell apart.
> ---
> v2
> efi_load_image_from_path() must initalize *buffer even in case of
> an error
> ---
> include/efi_loader.h | 1 +
> lib/efi_loader/efi_boottime.c | 17 ++++++++----
> lib/efi_loader/efi_root_node.c | 48 ++++++++++++++++++----------------
> 3 files changed, 39 insertions(+), 27 deletions(-)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index d3a1d4c465..07ef14ba1c 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -187,6 +187,7 @@ struct efi_handler {
> */
> enum efi_object_type {
> EFI_OBJECT_TYPE_UNDEFINED = 0,
> + EFI_OBJECT_TYPE_U_BOOT_FIRMWARE,
This looks like an unrelated change?
> EFI_OBJECT_TYPE_LOADED_IMAGE,
> EFI_OBJECT_TYPE_STARTED_IMAGE,
> };
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 78a4063949..f75e6c0169 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1680,10 +1680,13 @@ efi_status_t efi_load_image_from_path(struct efi_device_path *file_path,
> *buffer = NULL;
> *size = 0;
>
> + if (!file_path)
> + return EFI_INVALID_PARAMETER;
> +
> /* Open file */
> f = efi_file_from_path(file_path);
> if (!f)
> - return EFI_DEVICE_ERROR;
> + return EFI_NOT_FOUND;
>
> /* Get file size */
> bs = 0;
> @@ -1760,13 +1763,13 @@ efi_status_t EFIAPI efi_load_image(bool boot_policy,
> EFI_ENTRY("%d, %p, %pD, %p, %zd, %p", boot_policy, parent_image,
> file_path, source_buffer, source_size, image_handle);
>
> - if (!image_handle || !parent_image) {
> + if (!image_handle || !efi_search_obj(parent_image)) {
> ret = EFI_INVALID_PARAMETER;
> goto error;
> }
> -
> - if (!source_buffer && !file_path) {
> - ret = EFI_NOT_FOUND;
> + /* The parent image handle must refer to a loaded image */
> + if (!parent_image->type) {
> + ret = EFI_INVALID_PARAMETER;
> goto error;
> }
>
> @@ -1776,6 +1779,10 @@ efi_status_t EFIAPI efi_load_image(bool boot_policy,
> if (ret != EFI_SUCCESS)
> goto error;
> } else {
> + if (!source_size) {
> + ret = EFI_LOAD_ERROR;
> + goto error;
> + }
> dest_buffer = source_buffer;
> }
> /* split file_path which contains both the device and file parts */
> diff --git a/lib/efi_loader/efi_root_node.c b/lib/efi_loader/efi_root_node.c
> index e0fcbb85a4..38514e0820 100644
> --- a/lib/efi_loader/efi_root_node.c
> +++ b/lib/efi_loader/efi_root_node.c
> @@ -28,6 +28,7 @@ struct efi_root_dp {
> */
> efi_status_t efi_root_node_register(void)
> {
> + efi_status_t ret;
> struct efi_root_dp *dp;
>
> /* Create device path protocol */
> @@ -47,28 +48,31 @@ efi_status_t efi_root_node_register(void)
> dp->end.length = sizeof(struct efi_device_path);
>
> /* Create root node and install protocols */
> - return EFI_CALL(efi_install_multiple_protocol_interfaces(&efi_root,
> - /* Device path protocol */
> - &efi_guid_device_path, dp,
> - /* Device path to text protocol */
> - &efi_guid_device_path_to_text_protocol,
> - (void *)&efi_device_path_to_text,
> - /* Device path utilities protocol */
> - &efi_guid_device_path_utilities_protocol,
> - (void *)&efi_device_path_utilities,
> - /* Unicode collation protocol */
> - &efi_guid_unicode_collation_protocol,
> - (void *)&efi_unicode_collation_protocol,
> + ret = EFI_CALL(efi_install_multiple_protocol_interfaces
> + (&efi_root,
> + /* Device path protocol */
> + &efi_guid_device_path, dp,
> + /* Device path to text protocol */
> + &efi_guid_device_path_to_text_protocol,
> + (void *)&efi_device_path_to_text,
> + /* Device path utilities protocol */
> + &efi_guid_device_path_utilities_protocol,
> + (void *)&efi_device_path_utilities,
> + /* Unicode collation protocol */
> + &efi_guid_unicode_collation_protocol,
> + (void *)&efi_unicode_collation_protocol,
> #if CONFIG_IS_ENABLED(EFI_LOADER_HII)
> - /* HII string protocol */
> - &efi_guid_hii_string_protocol,
> - (void *)&efi_hii_string,
> - /* HII database protocol */
> - &efi_guid_hii_database_protocol,
> - (void *)&efi_hii_database,
> - /* HII configuration routing protocol */
> - &efi_guid_hii_config_routing_protocol,
> - (void *)&efi_hii_config_routing,
> + /* HII string protocol */
> + &efi_guid_hii_string_protocol,
> + (void *)&efi_hii_string,
> + /* HII database protocol */
> + &efi_guid_hii_database_protocol,
> + (void *)&efi_hii_database,
> + /* HII configuration routing protocol */
> + &efi_guid_hii_config_routing_protocol,
> + (void *)&efi_hii_config_routing,
> #endif
> - NULL));
> + NULL));
> + efi_root->type = EFI_OBJECT_TYPE_U_BOOT_FIRMWARE;
> + return ret;
I guess this is part of the unrelated change?
Alex
> }
> --
> 2.20.1
>
More information about the U-Boot
mailing list