On Wed, 12 Nov 2025 14:44:33 +0100
Quentin Schulz <[email protected]> wrote:

> Hi Köry,
> 
> On 11/12/25 2:17 PM, Kory Maincent wrote:
> > From: "Kory Maincent (TI.com)" <[email protected]>
> > 
> > Fix two memory allocation bugs in label_boot_extension():
> > 
> > 1. When label->fdtdir is not set, overlay_dir was used without any
> >     memory allocation. Add the missing calloc() in the else branch.
> > 
> > 2. When label->fdtdir is set, the allocation incorrectly used the
> >     'len' variable instead of 'dir_len'. The 'dir_len' variable is
> >     calculated to include the fdtdir length plus the trailing slash,
> >     while 'len' was only for the fdtdir length. This caused incorrect
> >     memory allocation size.
> > 
> > These issues could lead to memory corruption or undefined behavior when
> > processing device tree overlays via PXE boot.
> > 
> > Closes: https://lists.denx.de/pipermail/u-boot/2025-November/602892.html
> > Fixes: 935109cd9e97 ("boot: pxe_utils: Add extension board devicetree
> > overlay support") Signed-off-by: Kory Maincent (TI.com)
> > <[email protected]> ---
> >   boot/pxe_utils.c | 6 +++++-
> >   1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c
> > index 038416203fc..7a64b6b97d4 100644
> > --- a/boot/pxe_utils.c
> > +++ b/boot/pxe_utils.c
> > @@ -474,7 +474,7 @@ static void label_boot_extension(struct pxe_context
> > *ctx, slash = "";
> >   
> >             dir_len = strlen(label->fdtdir) + strlen(slash) + 1;
> > -           overlay_dir = calloc(1, len);
> > +           overlay_dir = calloc(1, dir_len);
> >             if (!overlay_dir)
> >                     return;
> >   
> > @@ -482,6 +482,10 @@ static void label_boot_extension(struct pxe_context
> > *ctx, slash);
> >     } else {
> >             dir_len = 2;
> > +           overlay_dir = calloc(1, dir_len);
> > +           if (!overlay_dir)
> > +                   return;
> > +
> >             snprintf(overlay_dir, dir_len, "/");
> >     }
> >     
> 
> I'm wondering if we couldn't make this easier to maintain by not having 
> two calloc and snprintf calls?
> 
> diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c
> index 038416203fc..6c1bf05cf66 100644
> --- a/boot/pxe_utils.c
> +++ b/boot/pxe_utils.c
> @@ -474,17 +474,17 @@ static void label_boot_extension(struct 
> pxe_context *ctx,
>                       slash = "";
> 
>               dir_len = strlen(label->fdtdir) + strlen(slash) + 1;
> -             overlay_dir = calloc(1, len);
> -             if (!overlay_dir)
> -                     return;
> -
> -             snprintf(overlay_dir, dir_len, "%s%s", label->fdtdir,
> -                      slash);
>       } else {
>               dir_len = 2;
> -             snprintf(overlay_dir, dir_len, "/");
> +             slash = "/";

In fact I think "./" should be the default one here.

>       }
> 
> +     overlay_dir = calloc(1, dir_len);
> +     if (!overlay_dir)
> +             return;
> +
> +     snprintf(overlay_dir, dir_len, "%s%s", label->fdtdir?: "", slash);

Yes, that's a good idea!

> Also, we probably want dir_len = len + strlen(slash) + 1 to avoid a 
> second strlen on label->fdtdir (at the top of the git context here).

Indeed!

> Finally, I'm wondering if the snprintf should not be dir_len - 1 
> considering we calloc with enough room for the trailing NUL character? 

No, snprintf second argument is the max size written including the null
character.

> Or not have + 1 for dir_len and calloc with + 1.

Regards,
-- 
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com

Reply via email to