On Tue Jun 10, 2025 at 1:16 AM IST, Mikhail Kshevetskiy wrote:
> This fix a possible NULL pointer dereference.
>
> There is also a risk of memory leaking within the same portion of code.
> The leak will happen if loaded image is bad or damaged. In this case
> u-boot-spl will try booting from the other available media. Unfortunately
> resources allocated for previous boot media will NOT be freed.
>
> We can't fix that issue as the memory allocation mechanism used here
> is unknown. It can be different kinds of malloc() or something else.
>
> To somewhat reduce memory consumption, one can try to reuse previously
> allocated memory as it's done in board_spl_fit_buffer_addr() from
> test/image/spl_load.c.
>
> The corresponding comment was put to the code as well.
>
> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
> ---
>  common/spl/spl_fit.c | 35 ++++++++++++++++++++++++++++++++++-
>  1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 321954a1547..3a7d753edcf 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -703,13 +703,46 @@ static int spl_simple_fit_read(struct spl_fit_info *ctx,
>        */
>       size = get_aligned_image_size(info, size, 0);
>       buf = board_spl_fit_buffer_addr(size, size, 1);
> +     if (!buf) {
> +             /*
> +              * We assume that non of the board will ever use 0x0 as a

s/non/none

Everything else looks good to me, thanks for the patch Mikhail.
Reviewed-by: Anshul Dalal <ansh...@ti.com>

> +              * valid load address. Theoretically some board could use it,
> +              * but this is extremely unlikely.
> +              */
> +             return -EIO;
> +     }
>  
>       count = info->read(info, offset, size, buf);
> +     if (!count) {
> +             /*
> +              * FIT could not be read. This means we should free the
> +              * memory allocated by board_spl_fit_buffer_addr().
> +              * Unfortunately, we don't know what memory allocation
> +              * mechanism was used:
> +              *   - For the SPL_SYS_MALLOC_SIMPLE case nothing could
> +              *     be done. The memory just could not be freed.
> +              *   - For statically allocated memory buffer we can try
> +              *     to reuse previously allocated memory (example:
> +              *     board_spl_fit_buffer_addr() function from the
> +              *     file test/image/spl_load.c).
> +              *   - For normall malloc() -- the memory will be lost!
> +              *
> +              * Please note:
> +              *   - FIT images with data placed outside of the FIT
> +              *     structure will cause small memory leak (several
> +              *     kilobytes),
> +              *   - FIT images with data placed inside to the FIT
> +              *     structure may cause huge memory leak (up to
> +              *     several megabytes). Do NOT use such images!
> +              */
> +             return -EIO;
> +     }
> +
>       ctx->fit = buf;
>       debug("fit read offset %lx, size=%lu, dst=%p, count=%lu\n",
>             offset, size, buf, count);
>  
> -     return (count == 0) ? -EIO : 0;
> +     return 0;
>  }
>  
>  static int spl_simple_fit_parse(struct spl_fit_info *ctx)

Reply via email to