[PATCH v2] efi_loader: fix iteration of FMP protocols

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Dec 21 13:45:27 CET 2023


On Mon, Dec 18, 2023 at 06:57:41PM +0900, Masahisa Kojima wrote:
> If one of the FMP protocols fails when calling GetImageInfo(),
> populating the ESRT ends up with failure and other FMP protocols
> are not added to the ESRT. We should still add all other FMP
> protocols to the ESRT.
>
> With this commit, iteration of all FMP protocols continues
> even though one of the FMP protocols fails.
>
> Signed-off-by: Masahisa Kojima <masahisa.kojima at linaro.org>
> ---
> Note that this patch addresses the following issue.
> https://source.denx.de/u-boot/custodians/u-boot-efi/-/issues/3
>
> changes in v2
> - add error handling when num_entries is 0 after calling fmp->get_image_info()
>
>  lib/efi_loader/efi_esrt.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/lib/efi_loader/efi_esrt.c b/lib/efi_loader/efi_esrt.c
> index 7f46d651e6..1f629a6023 100644
> --- a/lib/efi_loader/efi_esrt.c
> +++ b/lib/efi_loader/efi_esrt.c
> @@ -365,7 +365,7 @@ efi_status_t efi_esrt_populate(void)
>  		if (ret != EFI_SUCCESS) {
>  			EFI_PRINT("ESRT Unable to find FMP handle (%u)\n",
>  				  idx);
> -			goto out;
> +			continue;
>  		}
>  		fmp = handler->protocol_interface;
>
> @@ -380,15 +380,14 @@ efi_status_t efi_esrt_populate(void)
>  			 * fmp->get_image_info to return BUFFER_TO_SMALL.
>  			 */
>  			EFI_PRINT("ESRT erroneous FMP implementation\n");
> -			ret = EFI_INVALID_PARAMETER;
> -			goto out;
> +			continue;
>  		}
>
>  		ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, info_size,
>  					(void **)&img_info);
>  		if (ret != EFI_SUCCESS) {
>  			EFI_PRINT("ESRT failed to allocate memory for image info\n");
> -			goto out;
> +			continue;
>  		}
>
>  		/*
> @@ -406,7 +405,7 @@ efi_status_t efi_esrt_populate(void)
>  		if (ret != EFI_SUCCESS) {
>  			EFI_PRINT("ESRT failed to obtain image info from FMP\n");
>  			efi_free_pool(img_info);
> -			goto out;
> +			continue;
>  		}
>
>  		num_entries += desc_count;
> @@ -414,6 +413,13 @@ efi_status_t efi_esrt_populate(void)
>  		efi_free_pool(img_info);
>  	}
>
> +	/* error occurs in fmp->get_image_info() if num_entries is 0 here */
> +	if (!num_entries) {
> +		EFI_PRINT("Error occurs, num_entries should not be 0\n");
> +		ret = EFI_INVALID_PARAMETER;
> +		goto out;
> +	}
> +
>  	EFI_PRINT("ESRT create table with %u entries\n", num_entries);
>  	/*
>  	 * Allocate an ESRT with the sufficient number of entries to accommodate
> @@ -437,7 +443,7 @@ efi_status_t efi_esrt_populate(void)
>  		if (ret != EFI_SUCCESS) {
>  			EFI_PRINT("ESRT unable to find FMP handle (%u)\n",
>  				  idx);
> -			break;
> +			continue;
>  		}
>  		fmp = handler->protocol_interface;
>
> --
> 2.34.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
For the SynQuacer
Tested-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>



More information about the U-Boot mailing list