]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
tools: ensure zeroed padding in external FIT images
authorRoman Azarenko <roman.azarenko@iopsys.eu>
Fri, 25 Aug 2023 08:10:14 +0000 (10:10 +0200)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 17:22:32 +0000 (13:22 -0400)
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@iopsys.eu>
Reviewed-by: Simon Glass <sjg@chromium.org>
tools/fit_image.c

index 10f36e9342234f9e407b56e60b9787fb0a24e919..71e031c855081e750883b5760057f8dc3794e8c1 100644 (file)
@@ -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);
+       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);