[PATCH v3] barebox: Fix excessive loading of FIT images

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Christian Melki <christian.melki@xxxxxxxxxx>

Barebox doesn't use the FIT image size from the header
when loading FIT images. It bluntly assumes that the FIT image
is equal to the file size. Which would be true if the
FIT image is a file. But if it's situated on a raw device,
then barebox proceeds to load the entire contents of that
raw device, only to conclude that it only needed parts of it.
Fix it.

Cc: Daniel Brát <danek.brat@xxxxxxxxx>
Signed-off-by: Christian Melki <christian.melki@xxxxxxxxxx>
Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx>
---
v3 was here: https://lore.barebox.org/barebox/20220729205441.9512-1-danek.brat@xxxxxxxxx/
v2 -> v3:
 - restrict change to bootm_open_fit
 - use cached data in struct image_data
v1 -> v2:
 - use fdt32_to_cpu to read the totalsize from header
---
 common/bootm.c      | 9 ++++++++-
 common/image-fit.c  | 7 ++++---
 include/image-fit.h | 2 +-
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/common/bootm.c b/common/bootm.c
index fb1ed36a26dc..91a6e1688674 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -522,13 +522,20 @@ static int bootm_open_os_uimage(struct image_data *data)
 static int bootm_open_fit(struct image_data *data)
 {
 	struct fit_handle *fit;
+	struct fdt_header *header;
 	static const char *kernel_img = "kernel";
+	size_t flen, hlen;
 	int ret;
 
 	if (!IS_ENABLED(CONFIG_FITIMAGE))
 		return 0;
 
-	fit = fit_open(data->os_file, data->verbose, data->verify);
+	header = (struct fdt_header *)data->os_header;
+	flen = bootm_get_os_size(data);
+	hlen = fdt32_to_cpu(header->totalsize);
+
+	fit = fit_open(data->os_file, data->verbose, data->verify,
+		       min(flen, hlen));
 	if (IS_ERR(fit)) {
 		pr_err("Loading FIT image %s failed with: %pe\n", data->os_file, fit);
 		return PTR_ERR(fit);
diff --git a/common/image-fit.c b/common/image-fit.c
index 3e6e7fbd6d12..9bea62bb34a0 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -827,6 +827,7 @@ struct fit_handle *fit_open_buf(const void *buf, size_t size, bool verbose,
  * @filename:	The filename of the FIT image
  * @verbose:	If true, be more verbose
  * @verify:	The verify mode
+ * @max_size:	maximum length to read from file
  *
  * This opens a FIT image found in @filename. The returned handle is used as
  * context for the other FIT functions.
@@ -834,7 +835,7 @@ struct fit_handle *fit_open_buf(const void *buf, size_t size, bool verbose,
  * Return: A handle to a FIT image or a ERR_PTR
  */
 struct fit_handle *fit_open(const char *filename, bool verbose,
-			    enum bootm_verify verify)
+			    enum bootm_verify verify, loff_t max_size)
 {
 	struct fit_handle *handle;
 	int ret;
@@ -845,8 +846,8 @@ struct fit_handle *fit_open(const char *filename, bool verbose,
 	handle->verify = verify;
 
 	ret = read_file_2(filename, &handle->size, &handle->fit_alloc,
-			  FILESIZE_MAX);
-	if (ret) {
+			  max_size);
+	if (ret && ret != -EFBIG) {
 		pr_err("unable to read %s: %s\n", filename, strerror(-ret));
 		return ERR_PTR(ret);
 	}
diff --git a/include/image-fit.h b/include/image-fit.h
index f21545988e16..0b8e94bf4635 100644
--- a/include/image-fit.h
+++ b/include/image-fit.h
@@ -23,7 +23,7 @@ struct fit_handle {
 };
 
 struct fit_handle *fit_open(const char *filename, bool verbose,
-			    enum bootm_verify verify);
+			    enum bootm_verify verify, loff_t max_size);
 struct fit_handle *fit_open_buf(const void *buf, size_t len, bool verbose,
 				enum bootm_verify verify);
 void *fit_open_configuration(struct fit_handle *handle, const char *name);
-- 
2.39.2





[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux