mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-11-28 22:21:49 +01: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:
parent
3b32cf096b
commit
3fc85a782a
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user