summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorLihua Zhao <lihua.zhao@windriver.com>2020-04-18 01:59:10 -0700
committerTom Rini <trini@konsulko.com>2020-04-24 10:51:56 -0400
commit3fc85a782a3d46fcb32bfb93829d2424d696c4d3 (patch)
treeee7edd630917ca017fd28223fe4013bfded6d228 /tools
parent3b32cf096bd6b1d8871ecaddb4250756242fb5f9 (diff)
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 <lihua.zhao@windriver.com> Signed-off-by: Bin Meng <bin.meng@windriver.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/fit_image.c24
1 files changed, 14 insertions, 10 deletions
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;
}