diff mbox series

[u-boot-marvell,11/13] tools: kwboot: Calculate real used space in kwbimage header when calling kwboot_img_grow_hdr()

Message ID 20211025131304.21310-12-kabel@kernel.org
State Accepted
Commit d656f5a0ee224f29253573a6641ccb8fc1a3afad
Delegated to: Stefan Roese
Headers show
Series Yet another kwboot improvements | expand

Commit Message

Marek Behún Oct. 25, 2021, 1:13 p.m. UTC
From: Pali Rohár <pali@kernel.org>

Size of the header stored in kwbimage may be larger than real used size in
the kwbimage header. If there is unused space in kwbimage header then use
it for growing it. So update code to calculate used space of kwbimage
header.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Marek Behún <marek.behun@nic.cz>
---
 tools/kwboot.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

Comments

Stefan Roese Oct. 26, 2021, 5:48 a.m. UTC | #1
On 25.10.21 15:13, Marek Behún wrote:
> From: Pali Rohár <pali@kernel.org>
> 
> Size of the header stored in kwbimage may be larger than real used size in
> the kwbimage header. If there is unused space in kwbimage header then use
> it for growing it. So update code to calculate used space of kwbimage
> header.
> 
> Signed-off-by: Pali Rohár <pali@kernel.org>
> Reviewed-by: Marek Behún <marek.behun@nic.cz>

Reviewed-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan

> ---
>   tools/kwboot.c | 17 ++++++++++++++---
>   1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index bb7555369c..5d7cb7a774 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -1318,11 +1318,20 @@ kwboot_img_grow_hdr(void *img, size_t *size, size_t grow)
>   {
>   	uint32_t hdrsz, datasz, srcaddr;
>   	struct main_hdr_v1 *hdr = img;
> +	struct opt_hdr_v1 *ohdr;
>   	uint8_t *data;
>   
>   	srcaddr = le32_to_cpu(hdr->srcaddr);
>   
> -	hdrsz = kwbheader_size(img);
> +	/* calculate real used space in kwbimage header */
> +	if (kwbimage_version(img) == 0) {
> +		hdrsz = kwbheader_size(img);
> +	} else {
> +		hdrsz = sizeof(*hdr);
> +		for_each_opt_hdr_v1 (ohdr, hdr)
> +			hdrsz += opt_hdr_v1_size(ohdr);
> +	}
> +
>   	data = (uint8_t *)img + srcaddr;
>   	datasz = *size - srcaddr;
>   
> @@ -1339,8 +1348,10 @@ kwboot_img_grow_hdr(void *img, size_t *size, size_t grow)
>   
>   	if (kwbimage_version(img) == 1) {
>   		hdrsz += grow;
> -		hdr->headersz_msb = hdrsz >> 16;
> -		hdr->headersz_lsb = cpu_to_le16(hdrsz & 0xffff);
> +		if (hdrsz > kwbheader_size(img)) {
> +			hdr->headersz_msb = hdrsz >> 16;
> +			hdr->headersz_lsb = cpu_to_le16(hdrsz & 0xffff);
> +		}
>   	}
>   }
>   
> 


Viele Grüße,
Stefan
diff mbox series

Patch

diff --git a/tools/kwboot.c b/tools/kwboot.c
index bb7555369c..5d7cb7a774 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -1318,11 +1318,20 @@  kwboot_img_grow_hdr(void *img, size_t *size, size_t grow)
 {
 	uint32_t hdrsz, datasz, srcaddr;
 	struct main_hdr_v1 *hdr = img;
+	struct opt_hdr_v1 *ohdr;
 	uint8_t *data;
 
 	srcaddr = le32_to_cpu(hdr->srcaddr);
 
-	hdrsz = kwbheader_size(img);
+	/* calculate real used space in kwbimage header */
+	if (kwbimage_version(img) == 0) {
+		hdrsz = kwbheader_size(img);
+	} else {
+		hdrsz = sizeof(*hdr);
+		for_each_opt_hdr_v1 (ohdr, hdr)
+			hdrsz += opt_hdr_v1_size(ohdr);
+	}
+
 	data = (uint8_t *)img + srcaddr;
 	datasz = *size - srcaddr;
 
@@ -1339,8 +1348,10 @@  kwboot_img_grow_hdr(void *img, size_t *size, size_t grow)
 
 	if (kwbimage_version(img) == 1) {
 		hdrsz += grow;
-		hdr->headersz_msb = hdrsz >> 16;
-		hdr->headersz_lsb = cpu_to_le16(hdrsz & 0xffff);
+		if (hdrsz > kwbheader_size(img)) {
+			hdr->headersz_msb = hdrsz >> 16;
+			hdr->headersz_lsb = cpu_to_le16(hdrsz & 0xffff);
+		}
 	}
 }