[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:
pgpWjymPZohHa.pgp
Description: OpenPGP digital signature