1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 16:52:14 +02:00

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>
This commit is contained in:
Lihua Zhao
2020-04-18 01:59:10 -07:00
committed by Tom Rini
parent 3b32cf096b
commit 3fc85a782a

View File

@@ -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", fprintf(stderr, "%s: Failed to allocate memory (%d bytes)\n",
__func__, size); __func__, size);
ret = -ENOMEM; ret = -ENOMEM;
goto err_has_fd; goto err_munmap;
} }
ret = fdt_open_into(old_fdt, fdt, size); ret = fdt_open_into(old_fdt, fdt, size);
if (ret) { if (ret) {
debug("%s: Failed to expand FIT: %s\n", __func__, debug("%s: Failed to expand FIT: %s\n", __func__,
fdt_strerror(errno)); fdt_strerror(errno));
ret = -EINVAL; ret = -EINVAL;
goto err_has_fd; goto err_munmap;
} }
images = fdt_path_offset(fdt, FIT_IMAGES_PATH); images = fdt_path_offset(fdt, FIT_IMAGES_PATH);
if (images < 0) { if (images < 0) {
debug("%s: Cannot find /images node: %d\n", __func__, images); debug("%s: Cannot find /images node: %d\n", __func__, images);
ret = -EINVAL; ret = -EINVAL;
goto err_has_fd; goto err_munmap;
} }
for (node = fdt_first_subnode(fdt, images); 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__, debug("%s: Failed to write property: %s\n", __func__,
fdt_strerror(ret)); fdt_strerror(ret));
ret = -EINVAL; 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 the old fd so we can re-use it. */
close(fd); 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", fprintf(stderr, "%s: Can't open %s: %s\n",
params->cmdname, fname, strerror(errno)); params->cmdname, fname, strerror(errno));
ret = -EIO; ret = -EIO;
goto err_no_fd; goto err;
} }
if (write(fd, fdt, new_size) != new_size) { if (write(fd, fdt, new_size) != new_size) {
debug("%s: Failed to write external data to file %s\n", debug("%s: Failed to write external data to file %s\n",
__func__, strerror(errno)); __func__, strerror(errno));
ret = -EIO; ret = -EIO;
goto err_has_fd; goto err;
} }
ret = 0;
err_has_fd:
close(fd);
err_no_fd:
munmap(old_fdt, sbuf.st_size);
free(fdt); free(fdt);
close(fd);
return 0;
err_munmap:
munmap(old_fdt, sbuf.st_size);
err:
free(fdt);
close(fd);
return ret; return ret;
} }