В Fri, 13 Feb 2015 21:20:23 +0100 Lunar <[email protected]> пишет:
> From 9b441e5e6c602c71e522c594ca6cff72a12c078c Mon Sep 17 00:00:00 2001 > From: Lunar <[email protected]> > 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:
pgpkfA1jC2j4X.pgp
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
