[PATCH 1/2] tftp: rework the logic to validate the load address

Vaishnav Achath vaishnav.a at ti.com
Tue Sep 17 10:08:32 CEST 2024



On 16/09/24 20:50, Sughosh Ganu wrote:
> Use the lmb_read_check() function to verify if it is safe to use a
> region of memory to load data from a tftp command. The current logic
> checks the amount of free memory available, starting from the 'load
> address'. This call fails if the same region of memory has been used
> earlier. This used to work earlier as the LMB memory map had a local
> scope and was not persistent. Fix this issue by using the
> lmb_read_check() call instead which only returns an error in case the
> memory region has been marked for not allowing re-use.
> 
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> ---
> 
> Note: To be applied on next, on top of
> https://patchwork.ozlabs.org/project/uboot/patch/20240913073251.2286529-2-prasad.kummari@amd.com/
> 

Tested-by: Vaishnav Achath <vaishnav.a at ti.com>

>   net/tftp.c | 19 +------------------
>   1 file changed, 1 insertion(+), 18 deletions(-)
> 
> diff --git a/net/tftp.c b/net/tftp.c
> index b5d227d8bc..d6744bc24e 100644
> --- a/net/tftp.c
> +++ b/net/tftp.c
> @@ -82,7 +82,6 @@ static ulong	tftp_block_wrap;
>   static ulong	tftp_block_wrap_offset;
>   static int	tftp_state;
>   static ulong	tftp_load_addr;
> -static ulong	tftp_load_size;
>   #ifdef CONFIG_TFTP_TSIZE
>   /* The file size reported by the server */
>   static int	tftp_tsize;
> @@ -159,13 +158,8 @@ static inline int store_block(int block, uchar *src, unsigned int len)
>   	void *ptr;
>   
>   	if (CONFIG_IS_ENABLED(LMB)) {
> -		ulong end_addr = tftp_load_addr + tftp_load_size;
> -
> -		if (!end_addr)
> -			end_addr = ULONG_MAX;
> -
>   		if (store_addr < tftp_load_addr ||
> -		    store_addr + len > end_addr) {
> +		    lmb_read_check(store_addr, len)) {
>   			puts("\nTFTP error: ");
>   			puts("trying to overwrite reserved memory...\n");
>   			return -1;
> @@ -712,19 +706,8 @@ static void tftp_timeout_handler(void)
>   	}
>   }
>   
> -/* Initialize tftp_load_addr and tftp_load_size from image_load_addr and lmb */
>   static int tftp_init_load_addr(void)
>   {
> -	if (CONFIG_IS_ENABLED(LMB)) {
> -		phys_size_t max_size;
> -
> -		max_size = lmb_get_free_size(image_load_addr);
> -		if (!max_size)
> -			return -1;
> -
> -		tftp_load_size = max_size;
> -	}
> -
>   	tftp_load_addr = image_load_addr;
>   	return 0;
>   }


More information about the U-Boot mailing list