diff mbox series

[2/3] mkimage: fit: Unmmap the memory before closing fd in fit_import_data()

Message ID 1587200351-12590-2-git-send-email-bmeng.cn@gmail.com
State New
Headers show
Series [1/3] tools: Remove the out-of-date MinGW support codes | expand

Commit Message

Bin Meng April 18, 2020, 8:59 a.m. UTC
From: Lihua Zhao <lihua.zhao at windriver.com>

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 at windriver.com>
Signed-off-by: Bin Meng <bin.meng at windriver.com>
---

 tools/fit_image.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

Comments

Tom Rini April 24, 2020, 5:12 p.m. UTC | #1
On Sat, Apr 18, 2020 at 01:59:10AM -0700, Bin Meng wrote:

> From: Lihua Zhao <lihua.zhao at windriver.com>
> 
> 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 at windriver.com>
> Signed-off-by: Bin Meng <bin.meng at windriver.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/tools/fit_image.c b/tools/fit_image.c
index dd61a81..05c1f00 100644
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
@@ -556,21 +556,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);
@@ -591,10 +591,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);
 
@@ -609,22 +611,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;
 }