From bc47b53012d526d85a4ca7f493322094695b193e Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko <phco...@gmail.com> Date: Wed, 19 Jul 2023 15:25:14 +0200 Subject: [PATCH 2/4] loader/multiboot: Add --noescape option
This is needed to boot Solaris/Illumos on some boot paths that need quotes. Signed-off-by: Vladimir Serbinenko <phco...@gmail.com> --- grub-core/loader/i386/multiboot_mbi.c | 13 ++++---- grub-core/loader/multiboot.c | 46 ++++++++++++++++++++------- grub-core/loader/multiboot_mbi2.c | 12 +++---- include/grub/multiboot.h | 4 +-- include/grub/multiboot2.h | 4 +-- 5 files changed, 51 insertions(+), 28 deletions(-) diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c index 9a98e9bfe..c7c9daf18 100644 --- a/grub-core/loader/i386/multiboot_mbi.c +++ b/grub-core/loader/i386/multiboot_mbi.c @@ -659,13 +659,13 @@ grub_multiboot_free_mbi (void) } grub_err_t -grub_multiboot_init_mbi (int argc, char *argv[]) +grub_multiboot_init_mbi (int argc, char *argv[], int no_escape) { grub_ssize_t len = 0; grub_multiboot_free_mbi (); - len = grub_loader_cmdline_size (argc, argv, 0); + len = grub_loader_cmdline_size (argc, argv, no_escape); cmdline = grub_malloc (len); if (! cmdline) @@ -673,12 +673,12 @@ grub_multiboot_init_mbi (int argc, char *argv[]) cmdline_size = len; return grub_create_loader_cmdline (argc, argv, cmdline, - cmdline_size, GRUB_VERIFY_KERNEL_CMDLINE, 0); + cmdline_size, GRUB_VERIFY_KERNEL_CMDLINE, no_escape); } grub_err_t grub_multiboot_add_module (grub_addr_t start, grub_size_t size, - int argc, char *argv[]) + int argc, char *argv[], int no_escape) { struct module *newmod; grub_size_t len = 0; @@ -691,7 +691,7 @@ grub_multiboot_add_module (grub_addr_t start, grub_size_t size, newmod->size = size; newmod->next = 0; - len = grub_loader_cmdline_size (argc, argv, 0); + len = grub_loader_cmdline_size (argc, argv, no_escape); newmod->cmdline = grub_malloc (len); if (! newmod->cmdline) @@ -703,7 +703,8 @@ grub_multiboot_add_module (grub_addr_t start, grub_size_t size, total_modcmd += ALIGN_UP (len, 4); err = grub_create_loader_cmdline (argc, argv, newmod->cmdline, - newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, 0); + newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, no_escape); + if (err) { grub_free (newmod); diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c index 94be512c4..851f75334 100644 --- a/grub-core/loader/multiboot.c +++ b/grub-core/loader/multiboot.c @@ -295,11 +295,14 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)), #ifndef GRUB_USE_MULTIBOOT2 grub_multiboot_quirks = GRUB_MULTIBOOT_QUIRKS_NONE; +#endif int option_found = 0; + int no_escape = 0; do { option_found = 0; +#ifndef GRUB_USE_MULTIBOOT2 if (argc != 0 && grub_strcmp (argv[0], "--quirk-bad-kludge") == 0) { argc--; @@ -315,9 +318,17 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)), option_found = 1; grub_multiboot_quirks |= GRUB_MULTIBOOT_QUIRK_MODULES_AFTER_KERNEL; } - } while (option_found); #endif + if (argc != 0 && grub_strcmp (argv[0], "--noescape") == 0) + { + argc--; + argv++; + option_found = 1; + no_escape = 1; + } + } while (option_found); + if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); @@ -328,7 +339,7 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)), grub_dl_ref (my_mod); /* Skip filename. */ - GRUB_MULTIBOOT (init_mbi) (argc - 1, argv + 1); + GRUB_MULTIBOOT (init_mbi) (argc - 1, argv + 1, no_escape); grub_relocator_unload (GRUB_MULTIBOOT (relocator)); GRUB_MULTIBOOT (relocator) = grub_relocator_new (); @@ -367,18 +378,29 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), void *module = NULL; grub_addr_t target; grub_err_t err; - int nounzip = 0; + int nounzip = 0, noescape = 0, option_found = 0; grub_uint64_t lowest_addr = 0; - if (argc == 0) - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); - - if (grub_strcmp (argv[0], "--nounzip") == 0) + do { - argv++; - argc--; - nounzip = 1; - } + option_found = 0; + + if (argc != 0 && grub_strcmp (argv[0], "--nounzip") == 0) + { + argc--; + argv++; + option_found = 1; + nounzip = 1; + } + + if (argc != 0 && grub_strcmp (argv[0], "--noescape") == 0) + { + argc--; + argv++; + option_found = 1; + noescape = 1; + } + } while (option_found); if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); @@ -420,7 +442,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), target = 0; } - err = GRUB_MULTIBOOT (add_module) (target, size, argc - 1, argv + 1); + err = GRUB_MULTIBOOT (add_module) (target, size, argc - 1, argv + 1, noescape); if (err) { grub_file_close (file); diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c index 8a81a0359..fcaf3ba56 100644 --- a/grub-core/loader/multiboot_mbi2.c +++ b/grub-core/loader/multiboot_mbi2.c @@ -1031,13 +1031,13 @@ grub_multiboot2_free_mbi (void) } grub_err_t -grub_multiboot2_init_mbi (int argc, char *argv[]) +grub_multiboot2_init_mbi (int argc, char *argv[], int no_escape) { grub_ssize_t len = 0; grub_multiboot2_free_mbi (); - len = grub_loader_cmdline_size (argc, argv, 0); + len = grub_loader_cmdline_size (argc, argv, no_escape); cmdline = grub_malloc (len); if (! cmdline) @@ -1045,12 +1045,12 @@ grub_multiboot2_init_mbi (int argc, char *argv[]) cmdline_size = len; return grub_create_loader_cmdline (argc, argv, cmdline, cmdline_size, - GRUB_VERIFY_KERNEL_CMDLINE, 0); + GRUB_VERIFY_KERNEL_CMDLINE, no_escape); } grub_err_t grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, - int argc, char *argv[]) + int argc, char *argv[], int no_escape) { struct module *newmod; grub_size_t len = 0; @@ -1062,7 +1062,7 @@ grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, newmod->start = start; newmod->size = size; - len = grub_loader_cmdline_size (argc, argv, 0); + len = grub_loader_cmdline_size (argc, argv, no_escape); newmod->cmdline = grub_malloc (len); if (! newmod->cmdline) @@ -1074,7 +1074,7 @@ grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, total_modcmd += ALIGN_UP (len, MULTIBOOT_TAG_ALIGN); err = grub_create_loader_cmdline (argc, argv, newmod->cmdline, - newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, 0); + newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, no_escape); if (err) { grub_free (newmod->cmdline); diff --git a/include/grub/multiboot.h b/include/grub/multiboot.h index d8847f753..c8f4b1304 100644 --- a/include/grub/multiboot.h +++ b/include/grub/multiboot.h @@ -43,9 +43,9 @@ void grub_module (int argc, char *argv[]); void grub_multiboot_set_accepts_video (int val); grub_err_t grub_multiboot_make_mbi (grub_uint32_t *target); void grub_multiboot_free_mbi (void); -grub_err_t grub_multiboot_init_mbi (int argc, char *argv[]); +grub_err_t grub_multiboot_init_mbi (int argc, char *argv[], int noescape); grub_err_t grub_multiboot_add_module (grub_addr_t start, grub_size_t size, - int argc, char *argv[]); + int argc, char *argv[], int noescape); void grub_multiboot_set_bootdev (void); void grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize, diff --git a/include/grub/multiboot2.h b/include/grub/multiboot2.h index b90aa6989..fa8006b4d 100644 --- a/include/grub/multiboot2.h +++ b/include/grub/multiboot2.h @@ -35,9 +35,9 @@ void grub_module2 (int argc, char *argv[]); void grub_multiboot2_set_accepts_video (int val); grub_err_t grub_multiboot2_make_mbi (grub_uint32_t *target); void grub_multiboot2_free_mbi (void); -grub_err_t grub_multiboot2_init_mbi (int argc, char *argv[]); +grub_err_t grub_multiboot2_init_mbi (int argc, char *argv[], int noescape); grub_err_t grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, - int argc, char *argv[]); + int argc, char *argv[], int noescape); void grub_multiboot2_set_bootdev (void); void grub_multiboot2_add_elfsyms (grub_size_t num, grub_size_t entsize, -- 2.42.0
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel