[PATCH] cmd: sysboot: dont overwrite bootfile env

Art Nikpal email2tema at gmail.com
Thu Oct 14 06:34:43 CEST 2021


> Please also see this refactor which conflicts with this patch:
>
> http://patchwork.ozlabs.org/project/uboot/list/?series=264265
>
> I think that series should be reviewed/applied first since it was sent
in August.

yes ! i think need update your series because  cant apply it for
current uboot state

On Thu, Oct 14, 2021 at 12:58 AM Simon Glass <sjg at chromium.org> wrote:
>
> Hi,
>
> On Tue, 12 Oct 2021 at 21:39, Artem Lapkin <email2tema at gmail.com> wrote:
> >
> > Problem
> >
> > PXE cannot boot normally after Sysboot changed the bootfile env (called
> > from boot_extlinux) from the default "boot.scr.uimg" to
> > "/boot/extlinux/extlinux.conf".
> >
> > In addition, an unbootable extlinux configuration will also make the PXE
> > boot unbootable, because it will use the incorrect path "/boot/extlinux/"
> > from the bootfile env.
> >
> > Solution
> >
> > sysboot must care about bootfile and restore default value after usage.
> >
> > Come from:
> > https://patchwork.ozlabs.org/project/uboot/patch/20211012085544.3206394-1-art@khadas.com/
> >
> > Signed-off-by: Artem Lapkin <art at khadas.com>
> > ---
> >  cmd/sysboot.c | 30 ++++++++++++++++++++----------
> >  1 file changed, 20 insertions(+), 10 deletions(-)
>
> Please also see this refactor which conflicts with this patch:
>
> http://patchwork.ozlabs.org/project/uboot/list/?series=264265
>
> I think that series should be reviewed/applied first since it was sent
> in August.
>
> >
> > diff --git a/cmd/sysboot.c b/cmd/sysboot.c
> > index af6a2f1b7f..99b11cc127 100644
> > --- a/cmd/sysboot.c
> > +++ b/cmd/sysboot.c
> > @@ -2,6 +2,7 @@
> >
> >  #include <common.h>
> >  #include <command.h>
> > +#include <malloc.h>
> >  #include <env.h>
> >  #include <fs.h>
> >  #include "pxe_utils.h"
> > @@ -61,8 +62,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
> >         unsigned long pxefile_addr_r;
> >         struct pxe_menu *cfg;
> >         char *pxefile_addr_str;
> > -       char *filename;
> > +       char *filename, *filename_bak;
>
> Can we see filename_bak to NULL so we can simply the free() below?
>
> >         int prompt = 0;
> > +       int ret = 0;
> >
> >         is_pxe = false;
> >
> > @@ -83,9 +85,10 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
> >                 pxefile_addr_str = argv[4];
> >         }
> >
> > -       if (argc < 6) {
> > -               filename = env_get("bootfile");
> > -       } else {
> > +       filename = env_get("bootfile");
> > +       if (argc > 5) {
> > +               filename_bak = malloc(strlen(filename) + 1);
> > +               strcpy(filename_bak, filename);
> >                 filename = argv[5];
> >                 env_set("bootfile", filename);
> >         }
> > @@ -98,26 +101,26 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
> >                 do_getfile = do_get_any;
> >         } else {
> >                 printf("Invalid filesystem: %s\n", argv[3]);
> > -               return 1;
> > +               goto err;
> >         }
> >         fs_argv[1] = argv[1];
> >         fs_argv[2] = argv[2];
> >
> >         if (strict_strtoul(pxefile_addr_str, 16, &pxefile_addr_r) < 0) {
> >                 printf("Invalid pxefile address: %s\n", pxefile_addr_str);
> > -               return 1;
> > +               goto err;
> >         }
> >
> >         if (get_pxe_file(cmdtp, filename, pxefile_addr_r) < 0) {
> >                 printf("Error reading config file\n");
> > -               return 1;
> > +               goto err;
> >         }
> >
> >         cfg = parse_pxefile(cmdtp, pxefile_addr_r);
> >
> >         if (!cfg) {
> >                 printf("Error parsing config file\n");
> > -               return 1;
> > +               goto err;
> >         }
> >
> >         if (prompt)
> > @@ -126,8 +129,15 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
> >         handle_pxe_menu(cmdtp, cfg);
> >
> >         destroy_pxe_menu(cfg);
> > -
> > -       return 0;
> > +       goto ret;
>
> This is a bit ugly. Could we set 'ret' to 1 in the error cases above,
> or set it to 1 at the top ad 0 here, or pull the parsing code into a
> function...?
>
> > + err:
> > +       ret = 1;
> > + ret:
> > +       if (filename_bak) {
> > +               env_set("bootfile", filename_bak);
> > +               free(filename_bak);
> > +       }
> > +       return ret;
> >  }
> >
> >  U_BOOT_CMD(sysboot, 7, 1, do_sysboot,
> > --
> > 2.25.1
> >
>
> Regards,
> Simon


More information about the U-Boot mailing list