From: Lihua Zhao Date: Sat, 18 Apr 2020 08:59:10 +0000 (-0700) Subject: mkimage: fit: Unmmap the memory before closing fd in fit_import_data() X-Git-Tag: v2020.07-rc1~17^2~2 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3fc85a782a3d46fcb32bfb93829d2424d696c4d3;p=oweals%2Fu-boot.git mkimage: fit: Unmmap the memory before closing fd in fit_import_data() Without calling munmap(), the follow-up call to open() the same file with a flag O_TRUNC seems not to cause any issue on Linux, but it fails on Windows with error like below: Can't open kernel_fdt.itb.tmp: Permission denied Fix this by unmapping the memory before closing fd in fit_import_data(). Signed-off-by: Lihua Zhao Signed-off-by: Bin Meng --- diff --git a/tools/fit_image.c b/tools/fit_image.c index f32ee49575..c37cae3b26 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -563,21 +563,21 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) fprintf(stderr, "%s: Failed to allocate memory (%d bytes)\n", __func__, size); ret = -ENOMEM; - goto err_has_fd; + goto err_munmap; } ret = fdt_open_into(old_fdt, fdt, size); if (ret) { debug("%s: Failed to expand FIT: %s\n", __func__, fdt_strerror(errno)); ret = -EINVAL; - goto err_has_fd; + goto err_munmap; } images = fdt_path_offset(fdt, FIT_IMAGES_PATH); if (images < 0) { debug("%s: Cannot find /images node: %d\n", __func__, images); ret = -EINVAL; - goto err_has_fd; + goto err_munmap; } for (node = fdt_first_subnode(fdt, images); @@ -598,10 +598,12 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) debug("%s: Failed to write property: %s\n", __func__, fdt_strerror(ret)); ret = -EINVAL; - goto err_has_fd; + goto err_munmap; } } + munmap(old_fdt, sbuf.st_size); + /* Close the old fd so we can re-use it. */ close(fd); @@ -616,22 +618,24 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) fprintf(stderr, "%s: Can't open %s: %s\n", params->cmdname, fname, strerror(errno)); ret = -EIO; - goto err_no_fd; + goto err; } if (write(fd, fdt, new_size) != new_size) { debug("%s: Failed to write external data to file %s\n", __func__, strerror(errno)); ret = -EIO; - goto err_has_fd; + goto err; } - ret = 0; - -err_has_fd: + free(fdt); close(fd); -err_no_fd: + return 0; + +err_munmap: munmap(old_fdt, sbuf.st_size); +err: free(fdt); + close(fd); return ret; }