diff mbox series

boot: image-board: Mismatch a type between variable and return value

Message ID 20241105221149.507119-1-jh80.chung@samsung.com
State New
Headers show
Series boot: image-board: Mismatch a type between variable and return value | expand

Commit Message

Jaehoon Chung Nov. 5, 2024, 10:11 p.m. UTC
phys_addr_t can be used unsigned long long type with CONFIG_PHYS_64BIT.
But hextoul() is always returning to unsigned long. It can be assigned
to unexpected value. To avoid wrong behavior, change from hextoul() to
simple_strtoull().

Fixes: a4df06e41fa2 ("boot: fdt: Change type of env_get_bootm_low() to phys_addr_t")

Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
---
 boot/image-board.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Marek Vasut Nov. 5, 2024, 10:57 p.m. UTC | #1
On 11/5/24 11:11 PM, Jaehoon Chung wrote:
> phys_addr_t can be used unsigned long long type with CONFIG_PHYS_64BIT.
> But hextoul() is always returning to unsigned long. It can be assigned
> to unexpected value. To avoid wrong behavior, change from hextoul() to
> simple_strtoull().
> 
> Fixes: a4df06e41fa2 ("boot: fdt: Change type of env_get_bootm_low() to phys_addr_t")

Looking at:

7e5f460ec457 ("global: Convert simple_strtoul() with hex to hextoul()")

do you have to update any of the other hextoul() calls too ?

Maybe we need hextoull() ?

> Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
> ---
>   boot/image-board.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/boot/image-board.c b/boot/image-board.c
> index 1757e5816d84..977343a8995c 100644
> --- a/boot/image-board.c
> +++ b/boot/image-board.c
> @@ -547,7 +547,7 @@ int boot_ramdisk_high(ulong rd_data, ulong rd_len, ulong *initrd_start,
>   		/* a value of "no" or a similar string will act like 0,
>   		 * turning the "load high" feature off. This is intentional.
>   		 */
> -		initrd_high = hextoul(s, NULL);
> +		initrd_high = simple_strtoull(s, NULL, 16);
>   		if (initrd_high == ~0)
>   			initrd_copy_to_ram = 0;
>   	} else {
Jaehoon Chung Nov. 5, 2024, 11:47 p.m. UTC | #2
> -----Original Message-----
> From: Marek Vasut <marek.vasut@mailbox.org>
> Sent: Wednesday, November 6, 2024 7:57 AM
> To: Jaehoon Chung <jh80.chung@samsung.com>; u-boot@lists.denx.de
> Cc: trini@konsulko.com; sjg@chromium.org; marek.vasut+renesas@mailbox.org;
> laurent.pinchart@ideasonboard.com; m.szyprowski@samsung.com
> Subject: Re: [PATCH] boot: image-board: Mismatch a type between variable and return value
>
> On 11/5/24 11:11 PM, Jaehoon Chung wrote:
> > phys_addr_t can be used unsigned long long type with CONFIG_PHYS_64BIT.
> > But hextoul() is always returning to unsigned long. It can be assigned
> > to unexpected value. To avoid wrong behavior, change from hextoul() to
> > simple_strtoull().
> >
> > Fixes: a4df06e41fa2 ("boot: fdt: Change type of env_get_bootm_low() to phys_addr_t")
>
> Looking at:
>
> 7e5f460ec457 ("global: Convert simple_strtoul() with hex to hextoul()")

Thanks for informing it.

>
> do you have to update any of the other hextoul() calls too ?

I didn't check other hextoul().
During booting with initramfs on RPi (32bit), I found the problem that is not working fine because of this.

>
> Maybe we need hextoull() ?

IMO, We need hextoull() for some cases.
If there is no objection, I will send the patch for adding hextoull().
And I will check entire cases.

Best Regards,
Jaehoon Chung

>
> > Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
> > ---
> >   boot/image-board.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/boot/image-board.c b/boot/image-board.c
> > index 1757e5816d84..977343a8995c 100644
> > --- a/boot/image-board.c
> > +++ b/boot/image-board.c
> > @@ -547,7 +547,7 @@ int boot_ramdisk_high(ulong rd_data, ulong rd_len, ulong *initrd_start,
> >   		/* a value of "no" or a similar string will act like 0,
> >   		 * turning the "load high" feature off. This is intentional.
> >   		 */
> > -		initrd_high = hextoul(s, NULL);
> > +		initrd_high = simple_strtoull(s, NULL, 16);
> >   		if (initrd_high == ~0)
> >   			initrd_copy_to_ram = 0;
> >   	} else {
>
Marek Vasut Nov. 6, 2024, 2:12 a.m. UTC | #3
On 11/6/24 12:47 AM, Jaehoon Chung wrote:
> 
>> -----Original Message-----
>> From: Marek Vasut <marek.vasut@mailbox.org>
>> Sent: Wednesday, November 6, 2024 7:57 AM
>> To: Jaehoon Chung <jh80.chung@samsung.com>; u-boot@lists.denx.de
>> Cc: trini@konsulko.com; sjg@chromium.org; marek.vasut+renesas@mailbox.org;
>> laurent.pinchart@ideasonboard.com; m.szyprowski@samsung.com
>> Subject: Re: [PATCH] boot: image-board: Mismatch a type between variable and return value
>>
>> On 11/5/24 11:11 PM, Jaehoon Chung wrote:
>>> phys_addr_t can be used unsigned long long type with CONFIG_PHYS_64BIT.
>>> But hextoul() is always returning to unsigned long. It can be assigned
>>> to unexpected value. To avoid wrong behavior, change from hextoul() to
>>> simple_strtoull().
>>>
>>> Fixes: a4df06e41fa2 ("boot: fdt: Change type of env_get_bootm_low() to phys_addr_t")
>>
>> Looking at:
>>
>> 7e5f460ec457 ("global: Convert simple_strtoul() with hex to hextoul()")
> 
> Thanks for informing it.
> 
>>
>> do you have to update any of the other hextoul() calls too ?
> 
> I didn't check other hextoul().
> During booting with initramfs on RPi (32bit), I found the problem that is not working fine because of this.

Please check the other sites too, maybe there are more of these issues 
lurking around.

>> Maybe we need hextoull() ?
> 
> IMO, We need hextoull() for some cases.
> If there is no objection, I will send the patch for adding hextoull().
> And I will check entire cases.
No objection from me. Thank you.
diff mbox series

Patch

diff --git a/boot/image-board.c b/boot/image-board.c
index 1757e5816d84..977343a8995c 100644
--- a/boot/image-board.c
+++ b/boot/image-board.c
@@ -547,7 +547,7 @@  int boot_ramdisk_high(ulong rd_data, ulong rd_len, ulong *initrd_start,
 		/* a value of "no" or a similar string will act like 0,
 		 * turning the "load high" feature off. This is intentional.
 		 */
-		initrd_high = hextoul(s, NULL);
+		initrd_high = simple_strtoull(s, NULL, 16);
 		if (initrd_high == ~0)
 			initrd_copy_to_ram = 0;
 	} else {