[PATCH v2] tools: ensure zeroed padding in external FIT images
Simon Glass
sjg at chromium.org
Fri Aug 25 20:06:13 CEST 2023
On Fri, 25 Aug 2023 at 02:10, Roman Azarenko <roman.azarenko at iopsys.eu> wrote:
>
> Padding the header of an external FIT image is achieved by truncating
> the existing temporary FIT file to match the required alignment before
> appending image data. Reusing an existing file this way means that the
> padding will likely contain a portion of the original data not
> overwritten by the new header.
>
> Zero out any data past the end of the new header, and stop at either
> the end of the desired padding, or the end of the old FIT file,
> whichever comes first.
>
> Fixes: 7946a814a319 ("Revert "mkimage: fit: Do not tail-pad fitImage with external data"")
> Signed-off-by: Roman Azarenko <roman.azarenko at iopsys.eu>
> ---
> v2:
> - Use memset() on `fdt` instead of ftruncate() on `fd`, zero only
> the part that will become padding in the new FIT file.
> v1: https://lists.denx.de/pipermail/u-boot/2023-August/528213.html
>
> I'm trying to be a bit smart here and only zero out the amount of
> padding that we actually need, but no more than the total length of the
> old FIT file (not to cross the boundary of the mmaped region).
>
> See v1 for info on how to reproduce the original issue.
> ---
> tools/fit_image.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/tools/fit_image.c b/tools/fit_image.c
> index 9fe69ea0d9f8..d9da0ce8388f 100644
> --- a/tools/fit_image.c
> +++ b/tools/fit_image.c
> @@ -497,7 +497,7 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
> {
> void *buf = NULL;
> int buf_ptr;
> - int fit_size, new_size;
> + int fit_size, unpadded_size, new_size, pad_boundary;
> int fd;
> struct stat sbuf;
> void *fdt;
> @@ -564,9 +564,13 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
> /* Pack the FDT and place the data after it */
> fdt_pack(fdt);
>
> - new_size = fdt_totalsize(fdt);
> - new_size = ALIGN(new_size, align_size);
> + unpadded_size = fdt_totalsize(fdt);
> + new_size = ALIGN(unpadded_size, align_size);
> fdt_set_totalsize(fdt, new_size);
I didn't know that was allowed...I thought it needed fdt_open_into() ?
> + if (unpadded_size < fit_size) {
> + pad_boundary = new_size < fit_size ? new_size : fit_size;
> + memset(fdt + unpadded_size, 0, pad_boundary - unpadded_size);
> + }
> debug("Size reduced from %x to %x\n", fit_size, fdt_totalsize(fdt));
> debug("External data size %x\n", buf_ptr);
> munmap(fdt, sbuf.st_size);
> --
> 2.42.0
>
Reviewed-by: Simon Glass <sjg at chromium.org>
More information about the U-Boot
mailing list