[U-Boot] [PATCH 1/1] efi_loader: release file buffer after loading image

AKASHI Takahiro takahiro.akashi at linaro.org
Wed Mar 6 00:41:43 UTC 2019


On Tue, Mar 05, 2019 at 08:56:12PM +0100, Heinrich Schuchardt wrote:
> efi_load_pe() copies and rebases the UEFI image.
> We do not need the buffer with the file contents afterwards.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  lib/efi_loader/efi_boottime.c | 50 +++++++++++++----------------------
>  1 file changed, 18 insertions(+), 32 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index bd8b8a17ae..391681260c 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1693,6 +1693,7 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
>  	struct efi_loaded_image_obj **image_obj =
>  		(struct efi_loaded_image_obj **)image_handle;
>  	efi_status_t ret;
> +	void *dest_buffer;
>  
>  	EFI_ENTRY("%d, %p, %pD, %p, %zd, %p", boot_policy, parent_image,
>  		  file_path, source_buffer, source_size, image_handle);
> @@ -1708,7 +1709,7 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
>  	}
>  
>  	if (!source_buffer) {
> -		ret = efi_load_image_from_path(file_path, &source_buffer,
> +		ret = efi_load_image_from_path(file_path, &dest_buffer,
>  					       &source_size);
>  		if (ret != EFI_SUCCESS)
>  			goto error;
> @@ -1721,41 +1722,26 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
>  		/* In this case, file_path is the "device" path, i.e.
>  		 * something like a HARDWARE_DEVICE:MEMORY_MAPPED
>  		 */
> -		u64 addr;
> -		void *dest_buffer;
> -
> -		ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
> -					 EFI_RUNTIME_SERVICES_CODE,
> -					 efi_size_in_pages(source_size), &addr);
> -		if (ret != EFI_SUCCESS)
> -			goto error;
> -		dest_buffer = (void *)(uintptr_t)addr;
> -		memcpy(dest_buffer, source_buffer, source_size);
> -		source_buffer = dest_buffer;
> -

Are you sure? This code is what you added in your recent commit
0e18f584de59 ("efi_loader: LoadImage: always allocate new pages")
at v2019.04-rc2.

IMO, the comment:
>  		/* In this case, file_path is the "device" path, i.e.
>  		 * something like a HARDWARE_DEVICE:MEMORY_MAPPED

is also not accurate because "file_path" is normally non-NULL,
indicating where the content of "source_buffer" comes from.
In other words, "HARDWARE_DEVICE:MEMORY_MAPPED" is a quite irregular case.

-Takahiro Akashi


> +		dest_buffer = source_buffer;
>  		dp = file_path;
>  		fp = NULL;
>  	}
>  	ret = efi_setup_loaded_image(dp, fp, image_obj, &info);
> -	if (ret != EFI_SUCCESS)
> -		goto error_invalid_image;
> -	ret = efi_load_pe(*image_obj, source_buffer, info);
> -	if (ret != EFI_SUCCESS)
> -		goto error_invalid_image;
> -	/* Update the type of the allocated memory */
> -	efi_add_memory_map((uintptr_t)source_buffer,
> -			   efi_size_in_pages(source_size),
> -			   info->image_code_type, false);
> -	info->system_table = &systab;
> -	info->parent_handle = parent_image;
> -	return EFI_EXIT(EFI_SUCCESS);
> -error_invalid_image:
> -	/* The image is invalid. Release all associated resources. */
> -	efi_free_pages((uintptr_t)source_buffer,
> -		       efi_size_in_pages(source_size));
> -	efi_delete_handle(*image_handle);
> -	*image_handle = NULL;
> -	free(info);
> +	if (ret == EFI_SUCCESS)
> +		ret = efi_load_pe(*image_obj, dest_buffer, info);
> +	if (!source_buffer)
> +		/* Release buffer to which file was loaded */
> +		efi_free_pages((uintptr_t)dest_buffer,
> +			       efi_size_in_pages(source_size));
> +	if (ret == EFI_SUCCESS) {
> +		info->system_table = &systab;
> +		info->parent_handle = parent_image;
> +	} else {
> +		/* The image is invalid. Release all associated resources. */
> +		efi_delete_handle(*image_handle);
> +		*image_handle = NULL;
> +		free(info);
> +	}
>  error:
>  	return EFI_EXIT(ret);
>  }
> -- 
> 2.20.1
> 


More information about the U-Boot mailing list