grub-devel
[Top][All Lists]
Advanced

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

Re: [bug #44238] Add support for menu.c32 and vesamenu.c32 in lib/syslin


From: Andrei Borzenkov
Subject: Re: [bug #44238] Add support for menu.c32 and vesamenu.c32 in lib/syslinux_parse
Date: Fri, 13 Feb 2015 23:40:24 +0300

В Fri, 13 Feb 2015 21:20:23 +0100
Lunar <address@hidden> пишет:

> From 9b441e5e6c602c71e522c594ca6cff72a12c078c Mon Sep 17 00:00:00 2001
> From: Lunar <address@hidden>
> Date: Sat, 14 Feb 2015 14:14:25 +0100
> Subject: [PATCH 1/2] lib/syslinux_parse: add support for (vesa)menu.c32
> 
> Fixes Savannah bug #44238.
> ---
>  grub-core/lib/syslinux_parse.c | 157 
> ++++++++++++++++++++++++++---------------
>  1 file changed, 99 insertions(+), 58 deletions(-)
> 
> diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c
> index 2c874b1..b0d5f9e 100644
> --- a/grub-core/lib/syslinux_parse.c
> +++ b/grub-core/lib/syslinux_parse.c
> @@ -840,6 +840,74 @@ simplify_filename (char *str)
>  }
>  
>  static grub_err_t
> +print_config (struct output_buffer *outbuf,
> +           struct syslinux_menu *menu,
> +              const char *filename, const char *basedir)
> +{
> +  grub_err_t err;
> +  char *new_cwd, *new_target_cwd;
> +
> +  new_cwd = get_read_filename (menu, basedir);
> +  if (!new_cwd)
> +    return grub_errno;
> +  new_target_cwd = get_target_filename (menu, basedir);
> +  if (!new_target_cwd)
> +    return grub_errno;
> +

Memory leak.

> +  struct syslinux_menu *menuptr;
> +  char *newname;
> +  int depth = 0;
> +

If you move code anyway, please move declarations to the beginning.

> +  newname = get_read_filename (menu, filename);
> +  if (!newname)
> +    return grub_errno;

Memory leak.

> +  simplify_filename (newname);
> +
> +  print_string ("#");
> +  print_file (outbuf, menu, filename, NULL);
> +  print_string (" ");
> +  print (outbuf, newname, grub_strlen (newname));
> +  print_string (":\n");
> +
> +  for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
> +    if (grub_strcmp (menuptr->filename, newname) == 0
> +        || depth > 20)
> +      break;
> +  if (menuptr)
> +    {
> +      print_string ("  syslinux_configfile -r ");
> +      print_file (outbuf, menu, "/", NULL);
> +      print_string (" -c ");
> +      print_file (outbuf, menu, basedir, NULL);
> +      print_string (" ");
> +      print_file (outbuf, menu, filename, NULL);
> +      print_string ("\n");
> +    }
> +  else
> +    {
> +      err = config_file (outbuf, menu->root_read_directory,
> +                         menu->root_target_directory, new_cwd, 
> new_target_cwd,
> +                         newname, menu, menu->flavour);
> +      if (err == GRUB_ERR_FILE_NOT_FOUND
> +          || err == GRUB_ERR_BAD_FILENAME)
> +        {
> +          grub_errno = err = GRUB_ERR_NONE;
> +          print_string ("# File ");
> +          err = print (outbuf, newname, grub_strlen (newname));
> +          if (err)
> +            return err;

Memory leak.

> +          print_string (" not found\n");
> +        }
> +      if (err)
> +        return err;

Memory leak.

> +    }

Just use goto and free them all here. I understand that you just move
existing code but let's also fix them.

> +  grub_free (newname);
> +  grub_free (new_cwd);
> +  grub_free (new_target_cwd);
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
>  write_entry (struct output_buffer *outbuf,
>            struct syslinux_menu *menu,
>            struct syslinux_menuentry *curentry)
> @@ -1240,6 +1308,36 @@ write_entry (struct output_buffer *outbuf,
>           break;
>         }
>  
> +     if (grub_strcasecmp (basename, "menu.c32") == 0 ||
> +         grub_strcasecmp (basename, "vesamenu.c32") == 0)
> +       {
> +         char *ptr;
> +         char *end;
> +
> +         ptr = curentry->append;
> +         if (!ptr)
> +           return grub_errno;
> +
> +         while (*ptr)
> +           {
> +             end = ptr;
> +             for (end = ptr; *end && !grub_isspace (*end); end++);
> +             if (*end)
> +               *end++ = '\0';
> +
> +             /* "~" is supposed to be current file, so let's skip it */
> +             if (grub_strcmp (ptr, "~") != 0)
> +               {
> +                 err = print_config (outbuf, menu, ptr, "");
> +                 if (err != GRUB_ERR_NONE)
> +                   break;
> +                  }
> +             for (ptr = end; *ptr && grub_isspace (*ptr); ptr++);
> +           }
> +         err = GRUB_ERR_NONE;
> +         break;
> +       }
> +
>       /* FIXME: gdb, GFXBoot, Hdt, Ifcpu, Ifplop, Kbdmap,
>          FIXME: Linux, Lua, Meminfo, rosh, Sanbboot  */
>  
> @@ -1252,70 +1350,13 @@ write_entry (struct output_buffer *outbuf,
>        }
>      case KERNEL_CONFIG:
>        {
> -     char *new_cwd, *new_target_cwd;
>       const char *ap;
>       ap = curentry->append;
>       if (!ap)
>         ap = curentry->argument;
>       if (!ap)
>         ap = "";
> -     new_cwd = get_read_filename (menu, ap);
> -     if (!new_cwd)
> -       return grub_errno;
> -     new_target_cwd = get_target_filename (menu, ap);
> -     if (!new_target_cwd)
> -       return grub_errno;
> -
> -     struct syslinux_menu *menuptr;
> -     char *newname;
> -     int depth = 0;
> -     
> -     newname = get_read_filename (menu, curentry->kernel_file);
> -     if (!newname)
> -       return grub_errno;
> -     simplify_filename (newname);
> -
> -     print_string ("#");
> -     print_file (outbuf, menu, curentry->kernel_file, NULL);
> -     print_string (" ");
> -     print (outbuf, newname, grub_strlen (newname));
> -     print_string (":\n");
> -
> -     for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++)
> -       if (grub_strcmp (menuptr->filename, newname) == 0
> -           || depth > 20)
> -         break;
> -     if (menuptr)
> -       {
> -         print_string ("  syslinux_configfile -r ");
> -         print_file (outbuf, menu, "/", NULL);
> -         print_string (" -c ");
> -         print_file (outbuf, menu, ap, NULL);
> -         print_string (" ");
> -         print_file (outbuf, menu, curentry->kernel_file, NULL);
> -         print_string ("\n");
> -       }
> -     else
> -       {
> -         err = config_file (outbuf, menu->root_read_directory,
> -                            menu->root_target_directory, new_cwd, 
> new_target_cwd,
> -                            newname, menu, menu->flavour);
> -         if (err == GRUB_ERR_FILE_NOT_FOUND
> -             || err == GRUB_ERR_BAD_FILENAME)
> -           {
> -             grub_errno = err = GRUB_ERR_NONE;
> -             print_string ("# File ");
> -             err = print (outbuf, newname, grub_strlen (newname));
> -             if (err)
> -               return err;
> -             print_string (" not found\n");
> -           }
> -         if (err)
> -           return err;
> -       }
> -     grub_free (newname);
> -     grub_free (new_cwd);
> -     grub_free (new_target_cwd);
> +     print_config (outbuf, menu, curentry->kernel_file, ap);
>        }
>        break;
>      case KERNEL_NO_KERNEL:

Attachment: pgpWjymPZohHa.pgp
Description: OpenPGP digital signature


reply via email to

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