grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Avoid crash on empty menu


From: Marco Gerards
Subject: Re: [PATCH] Avoid crash on empty menu
Date: Fri, 09 Nov 2007 16:20:39 +0100
User-agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux)

Christian Franke <address@hidden> writes:

> If grub.cfg does not contain any valid menuentry statements, an empty
> menu is opened.
> grub-emu crashes (and real grub behaves "interesting") if the first
> entry is selected.
>
> The attached patch adds the missing nullptr checks.
>
> An alternative would be to treat an empty menu as a syntax error in
> main.c::read_config_file(), at least if !nested.

Right, perhaps.  But for now this is sufficient as it fixes a very
annoying bug :-)

> During testing, I found the following issues:
>
> - If the file does not exist, read_config_file() produces a memory
> leak, because newmenu is allocated first.
>
> - The commands "source FILE" and "configfile FILE" open a nested
> normal mode shell (and produce this leak) if the file is missing. An
> error message should IMO be printed instead.
>
> - The sequence "c" -> "rescue" -> "normal" appends the same entries to
> the existing menu, because the old entry is reused from "menu" data
> slot.
>
> Thanks for any comment.
>
> Christian
>
> 2007-11-07  Christian Franke  <address@hidden>
>
>       * normal/menu.c (menu_run): Check for empty menu to avoid crash.
>       (grub_run_menu): Likewise.
>
>
> --- grub2.orig/normal/menu.c  2007-08-20 16:35:20.000000000 +0200
> +++ grub2/normal/menu.c       2007-11-07 21:57:44.375000000 +0100
> @@ -412,7 +412,11 @@ run_menu (grub_menu_t menu, int nested)
>             goto refresh;
>  
>           case 'e':
> -           grub_menu_entry_run (get_entry (menu, first + offset));
> +             {
> +               grub_menu_entry_t e = get_entry (menu, first + offset);
> +               if (e)
> +                 grub_menu_entry_run (e);
> +             }
>             goto refresh;
>             
>           default:
> @@ -451,10 +455,13 @@ grub_menu_run (grub_menu_t menu, int nes
>        if (boot_entry < 0)
>       break;
>  
> +      e = get_entry (menu, boot_entry);
> +      if (! e)
> +     continue; /* menu is empty */

Please use proper interpunctions for comments.

>        grub_cls ();
>        grub_setcursor (1);
>  
> -      e = get_entry (menu, boot_entry);
>        grub_printf ("  Booting \'%s\'\n\n", e->title);
>    
>        run_menu_entry (e);

--
Marco





reply via email to

[Prev in Thread] Current Thread [Next in Thread]