X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=tools%2Ffit_common.c;h=cdf987d3c1389004ccf98135cd1d88aa54e174ff;hb=718f7bf7ca31277fbe5fdf49b6fa897736b7f36d;hp=286f357ab1769af8c507e6c94719558800ce7a92;hpb=ef0af64b1c45b8ee28db12c16c4ee881ee328e44;p=oweals%2Fu-boot.git diff --git a/tools/fit_common.c b/tools/fit_common.c index 286f357ab1..cdf987d3c1 100644 --- a/tools/fit_common.c +++ b/tools/fit_common.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2014 * DENX Software Engineering @@ -14,8 +15,6 @@ * some functions added to address abstraction * * All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0+ */ #include "imagetool.h" @@ -27,7 +26,10 @@ int fit_verify_header(unsigned char *ptr, int image_size, struct image_tool_params *params) { - return fdt_check_header(ptr); + if (fdt_check_header(ptr) != EXIT_SUCCESS || !fit_check_format(ptr)) + return EXIT_FAILURE; + + return EXIT_SUCCESS; } int fit_check_image_types(uint8_t type) @@ -38,14 +40,15 @@ int fit_check_image_types(uint8_t type) return EXIT_FAILURE; } -int mmap_fdt(const char *cmdname, const char *fname, void **blobp, - struct stat *sbuf, bool delete_on_error) +int mmap_fdt(const char *cmdname, const char *fname, size_t size_inc, + void **blobp, struct stat *sbuf, bool delete_on_error, + bool read_only) { void *ptr; int fd; /* Load FIT blob into memory (we need to write hashes/signatures) */ - fd = open(fname, O_RDWR | O_BINARY); + fd = open(fname, (read_only ? O_RDONLY : O_RDWR) | O_BINARY); if (fd < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", @@ -59,8 +62,19 @@ int mmap_fdt(const char *cmdname, const char *fname, void **blobp, goto err; } + if (size_inc) { + sbuf->st_size += size_inc; + if (ftruncate(fd, sbuf->st_size)) { + fprintf(stderr, "%s: Can't expand %s: %s\n", + cmdname, fname, strerror(errno)); + goto err; + } + } + errno = 0; - ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + ptr = mmap(0, sbuf->st_size, + (read_only ? PROT_READ : PROT_READ | PROT_WRITE), MAP_SHARED, + fd, 0); if ((ptr == MAP_FAILED) || (errno != 0)) { fprintf(stderr, "%s: Can't read %s: %s\n", cmdname, fname, strerror(errno)); @@ -73,6 +87,18 @@ int mmap_fdt(const char *cmdname, const char *fname, void **blobp, goto err; } + /* expand if needed */ + if (size_inc) { + int ret; + + ret = fdt_open_into(ptr, ptr, sbuf->st_size); + if (ret) { + fprintf(stderr, "%s: Cannot expand FDT: %s\n", + cmdname, fdt_strerror(ret)); + goto err; + } + } + *blobp = ptr; return fd;