diff mbox series

[U-Boot] imximage: Check the IVT offset in the correct location

Message ID 1520541633-29312-1-git-send-email-festevam@gmail.com
State Awaiting Upstream
Headers show
Series [U-Boot] imximage: Check the IVT offset in the correct location | expand

Commit Message

Fabio Estevam March 8, 2018, 8:40 p.m. UTC
From: Fabio Estevam <fabio.estevam@nxp.com>

Sometimes imximage throws the following error:

  CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
  CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
  MKIMAGE u-boot-dtb.imx
Error: No BOOT_FROM tag in board/freescale/vf610twr/imximage.cfg.cfgtmp
arch/arm/mach-imx/Makefile:100: recipe for target 'u-boot-dtb.imx' failed

This problem happens because imximage_ivt_offset is being checked
at un unsafe point, and in some cases it can be checked prior to
its assignment.

Fix this issue by only checking imximage_ivt_offset after its
assignment has really occurred.

Introduce a check_ivt_offset() function to help on this task.

Reported-by: Breno Lima <breno.lima@nxp.com>
Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
---
 tools/imximage.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

Comments

Breno Matheus Lima March 8, 2018, 8:53 p.m. UTC | #1
Hi Fabio,

2018-03-08 17:40 GMT-03:00 Fabio Estevam <festevam@gmail.com>:
> From: Fabio Estevam <fabio.estevam@nxp.com>
>
> Sometimes imximage throws the following error:
>
>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>   MKIMAGE u-boot-dtb.imx
> Error: No BOOT_FROM tag in board/freescale/vf610twr/imximage.cfg.cfgtmp
> arch/arm/mach-imx/Makefile:100: recipe for target 'u-boot-dtb.imx' failed
>
> This problem happens because imximage_ivt_offset is being checked
> at un unsafe point, and in some cases it can be checked prior to
> its assignment.
>
> Fix this issue by only checking imximage_ivt_offset after its
> assignment has really occurred.
>
> Introduce a check_ivt_offset() function to help on this task.
>
> Reported-by: Breno Lima <breno.lima@nxp.com>
> Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>

Tested-by: Breno Lima <breno.lima@nxp.com>

Thanks,
Breno Lima
Stefano Babic March 8, 2018, 9:31 p.m. UTC | #2
On 08/03/2018 21:53, Breno Matheus Lima wrote:
> Hi Fabio,
> 
> 2018-03-08 17:40 GMT-03:00 Fabio Estevam <festevam@gmail.com>:
>> From: Fabio Estevam <fabio.estevam@nxp.com>
>>
>> Sometimes imximage throws the following error:
>>
>>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>>   MKIMAGE u-boot-dtb.imx
>> Error: No BOOT_FROM tag in board/freescale/vf610twr/imximage.cfg.cfgtmp
>> arch/arm/mach-imx/Makefile:100: recipe for target 'u-boot-dtb.imx' failed
>>
>> This problem happens because imximage_ivt_offset is being checked
>> at un unsafe point, and in some cases it can be checked prior to
>> its assignment.
>>
>> Fix this issue by only checking imximage_ivt_offset after its
>> assignment has really occurred.
>>
>> Introduce a check_ivt_offset() function to help on this task.
>>
>> Reported-by: Breno Lima <breno.lima@nxp.com>
>> Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
>> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> 
> Tested-by: Breno Lima <breno.lima@nxp.com>


Thanks both - I apply it.

Best regards,
Stefano
Troy Kisky March 8, 2018, 10:03 p.m. UTC | #3
On 3/8/2018 12:53 PM, Breno Matheus Lima wrote:
> Hi Fabio,
> 
> 2018-03-08 17:40 GMT-03:00 Fabio Estevam <festevam@gmail.com>:
>> From: Fabio Estevam <fabio.estevam@nxp.com>
>>
>> Sometimes imximage throws the following error:
>>
>>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>>   CFGS    board/freescale/vf610twr/imximage.cfg.cfgtmp
>>   MKIMAGE u-boot-dtb.imx
>> Error: No BOOT_FROM tag in board/freescale/vf610twr/imximage.cfg.cfgtmp
>> arch/arm/mach-imx/Makefile:100: recipe for target 'u-boot-dtb.imx' failed
>>
>> This problem happens because imximage_ivt_offset is being checked
>> at un unsafe point, and in some cases it can be checked prior to
>> its assignment.
>>
>> Fix this issue by only checking imximage_ivt_offset after its
>> assignment has really occurred.
>>
>> Introduce a check_ivt_offset() function to help on this task.
>>
>> Reported-by: Breno Lima <breno.lima@nxp.com>
>> Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
>> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> 
> Tested-by: Breno Lima <breno.lima@nxp.com>
> 
> Thanks,
> Breno Lima
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
> 


Did you test that an image without BOOT_FROM still gets an error message ?


BR
Troy
Fabio Estevam March 8, 2018, 10:24 p.m. UTC | #4
Hi Troy,

On Thu, Mar 8, 2018 at 7:03 PM, Troy Kisky
<troy.kisky@boundarydevices.com> wrote:

> Did you test that an image without BOOT_FROM still gets an error message ?

Good point! It is not properly detecting such case.

Will need to rework the patch, thanks.
diff mbox series

Patch

diff --git a/tools/imximage.c b/tools/imximage.c
index eb7e682..26339ee 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -592,6 +592,15 @@  static void copy_plugin_code(struct imx_header *imxhdr, char *plugin_file)
 	imxhdr->header.hdr_v2.boot_data.plugin = 1;
 }
 
+static void check_ivt_offset(uint32_t offset)
+{
+	/* Exit if there is no field specifying the flash_offset */
+	if (offset == FLASH_OFFSET_UNDEFINED) {
+		fprintf(stderr, "Error: No boot offset specified");
+		exit(EXIT_FAILURE);
+	}
+}
+
 static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 				char *name, int lineno, int fld, int dcd_len)
 {
@@ -613,6 +622,7 @@  static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 	case CMD_BOOT_FROM:
 		imximage_ivt_offset = get_table_entry_id(imximage_boot_offset,
 					"imximage boot option", token);
+		check_ivt_offset(imximage_ivt_offset);
 		if (imximage_ivt_offset == -1) {
 			fprintf(stderr, "Error: %s[%d] -Invalid boot device"
 				"(%s)\n", name, lineno, token);
@@ -641,6 +651,7 @@  static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 		break;
 	case CMD_BOOT_OFFSET:
 		imximage_ivt_offset = get_cfg_value(token, name, lineno);
+		check_ivt_offset(imximage_ivt_offset);
 		if (unlikely(cmd_ver_first != 1))
 			cmd_ver_first = 0;
 		break;
@@ -777,11 +788,6 @@  static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name)
 	(*set_dcd_rst)(imxhdr, dcd_len, name, lineno);
 	fclose(fd);
 
-	/* Exit if there is no BOOT_FROM field specifying the flash_offset */
-	if (imximage_ivt_offset == FLASH_OFFSET_UNDEFINED) {
-		fprintf(stderr, "Error: No BOOT_FROM tag in %s\n", name);
-		exit(EXIT_FAILURE);
-	}
 	return dcd_len;
 }