Using titles is broken concept and the only reason we support it in default
is backwards compatibility. Maybe it's better to restrict it to just IDs

Le lun. 30 sept. 2024, 20:48, Leo Sandoval <lsand...@redhat.com> a écrit :

> From: Peter Jones <pjo...@redhat.com>
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1026084
>
> Signed-off-by: Peter Jones <pjo...@redhat.com>
> ---
>  grub-core/normal/menu.c | 85 ++++++++++++++++++++++++++++-------------
>  1 file changed, 58 insertions(+), 27 deletions(-)
>
> diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
> index 6a90e091f..6444ee6f9 100644
> --- a/grub-core/normal/menu.c
> +++ b/grub-core/normal/menu.c
> @@ -163,15 +163,40 @@ grub_menu_set_timeout (int timeout)
>      }
>  }
>
> +static int
> +menuentry_eq (const char *id, const char *spec)
> +{
> +  const char *ptr1, *ptr2;
> +  ptr1 = id;
> +  ptr2 = spec;
> +  while (1)
> +    {
> +      if (*ptr2 == '>' && ptr2[1] != '>' && *ptr1 == 0)
> +       return ptr2 - spec;
> +      if (*ptr2 == '>' && ptr2[1] != '>')
> +       return 0;
> +      if (*ptr2 == '>')
> +       ptr2++;
> +      if (*ptr1 != *ptr2)
> +       return 0;
> +      if (*ptr1 == 0)
> +       return ptr1 - id;
> +      ptr1++;
> +      ptr2++;
> +    }
> +  return 0;
> +}
> +
>  /* Get the first entry number from the value of the environment variable
> NAME,
>     which is a space-separated list of non-negative integers.  The entry
> number
>     which is returned is stripped from the value of NAME.  If no entry
> number
>     can be found, -1 is returned.  */
>  static int
> -get_and_remove_first_entry_number (const char *name)
> +get_and_remove_first_entry_number (grub_menu_t menu, const char *name)
>  {
>    const char *val, *tail;
>    int entry;
> +  int sz = 0;
>
>    val = grub_env_get (name);
>    if (! val)
> @@ -181,9 +206,39 @@ get_and_remove_first_entry_number (const char *name)
>
>    entry = (int) grub_strtoul (val, &tail, 0);
>
> +  if (grub_errno == GRUB_ERR_BAD_NUMBER)
> +    {
> +      /* See if the variable matches the title of a menu entry.  */
> +      grub_menu_entry_t e = menu->entry_list;
> +      int i;
> +
> +      for (i = 0; e; i++)
> +       {
> +         sz = menuentry_eq (e->title, val);
> +         if (sz < 1)
> +           sz = menuentry_eq (e->id, val);
> +
> +         if (sz >= 1)
> +           {
> +             entry = i;
> +             break;
> +           }
> +         e = e->next;
> +       }
> +
> +      if (sz > 0)
> +       grub_errno = GRUB_ERR_NONE;
> +
> +      if (! e)
> +       entry = -1;
> +    }
> +
>    if (grub_errno == GRUB_ERR_NONE)
>      {
> -      /* Skip whitespace to find the next digit.  */
> +      if (sz > 0)
> +       tail += sz;
> +
> +      /* Skip whitespace to find the next entry.  */
>        while (*tail && grub_isspace (*tail))
>         tail++;
>        grub_env_set (name, tail);
> @@ -346,7 +401,7 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
>    grub_menu_execute_entry (entry, 1);
>
>    /* Deal with fallback entries.  */
> -  while ((fallback_entry = get_and_remove_first_entry_number ("fallback"))
> +  while ((fallback_entry = get_and_remove_first_entry_number (menu,
> "fallback"))
>          >= 0)
>      {
>        grub_print_error ();
> @@ -464,30 +519,6 @@ grub_menu_register_viewer (struct grub_menu_viewer
> *viewer)
>    viewers = viewer;
>  }
>
> -static int
> -menuentry_eq (const char *id, const char *spec)
> -{
> -  const char *ptr1, *ptr2;
> -  ptr1 = id;
> -  ptr2 = spec;
> -  while (1)
> -    {
> -      if (*ptr2 == '>' && ptr2[1] != '>' && *ptr1 == 0)
> -       return 1;
> -      if (*ptr2 == '>' && ptr2[1] != '>')
> -       return 0;
> -      if (*ptr2 == '>')
> -       ptr2++;
> -      if (*ptr1 != *ptr2)
> -       return 0;
> -      if (*ptr1 == 0)
> -       return 1;
> -      ptr1++;
> -      ptr2++;
> -    }
> -}
> -
> -
>  /* Get the entry number from the variable NAME.  */
>  static int
>  get_entry_number (grub_menu_t menu, const char *name)
> --
> 2.46.1
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to