[PATCH v3 3/3] common/spl: improve error handling in spl_fit
Anshul Dalal
anshuld at ti.com
Tue Jun 10 06:36:24 CEST 2025
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.kshevetskiy at 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 <anshuld at 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)
More information about the U-Boot
mailing list