All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH vRESEND 1/4] Add "noescape" argument to cmdline creation
@ 2024-05-17  7:52 Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 2/4] loader/multiboot: Add --noescape option Vladimir Serbinenko
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Vladimir Serbinenko @ 2024-05-17  7:52 UTC (permalink / raw)
  To: grub-devel; +Cc: Vladimir Serbinenko

If OS parses in a way different from sh-like that GRUB does, escaping does
more harm than good. Note that allows to specify entire command line in a
single argument e.g. multiboot --noescape /kernel "a b c".

This is needed to boot Solaris/Illumos on some boot paths that need quotes.

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
---
 grub-core/lib/cmdline.c                   | 40 ++++++++++++++---------
 grub-core/loader/arm/linux.c              |  4 +--
 grub-core/loader/arm64/xen_boot.c         |  4 +--
 grub-core/loader/efi/linux.c              |  4 +--
 grub-core/loader/i386/linux.c             |  2 +-
 grub-core/loader/i386/multiboot_mbi.c     |  8 ++---
 grub-core/loader/i386/pc/linux.c          |  2 +-
 grub-core/loader/i386/xen.c               |  6 ++--
 grub-core/loader/mips/linux.c             |  4 +--
 grub-core/loader/multiboot_mbi2.c         |  8 ++---
 grub-core/loader/powerpc/ieee1275/linux.c |  4 +--
 grub-core/loader/sparc64/ieee1275/linux.c |  4 +--
 include/grub/lib/cmdline.h                |  5 +--
 13 files changed, 52 insertions(+), 43 deletions(-)

diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c
index ed0b149dc..715392fac 100644
--- a/grub-core/lib/cmdline.c
+++ b/grub-core/lib/cmdline.c
@@ -45,14 +45,14 @@ static unsigned int check_arg (char *c, int *has_space)
   return size;
 }
 
-unsigned int grub_loader_cmdline_size (int argc, char *argv[])
+unsigned int grub_loader_cmdline_size (int argc, char *argv[], int noescape)
 {
   int i;
   unsigned int size = 0;
 
   for (i = 0; i < argc; i++)
     {
-      size += check_arg (argv[i], 0);
+      size += noescape ? grub_strlen(argv[i]) : check_arg (argv[i], 0);
       size++; /* Separator space or NULL.  */
     }
 
@@ -64,16 +64,17 @@ unsigned int grub_loader_cmdline_size (int argc, char *argv[])
 
 grub_err_t
 grub_create_loader_cmdline (int argc, char *argv[], char *buf,
-			    grub_size_t size, enum grub_verify_string_type type)
+			    grub_size_t size, enum grub_verify_string_type type,
+			    int noescape)
 {
-  int i, space;
+  int i, space = 0;
   unsigned int arg_size;
   char *c, *orig_buf = buf;
 
   for (i = 0; i < argc; i++)
     {
       c = argv[i];
-      arg_size = check_arg(argv[i], &space);
+      arg_size = noescape ? grub_strlen(argv[i]) : check_arg(argv[i], &space);
       arg_size++; /* Separator space or NULL.  */
 
       if (size < arg_size)
@@ -81,21 +82,28 @@ grub_create_loader_cmdline (int argc, char *argv[], char *buf,
 
       size -= arg_size;
 
-      if (space)
-	*buf++ = '"';
-
-      while (*c)
+      if (noescape)
 	{
-	  if (*c == '\\' || *c == '\'' || *c == '"')
-	    *buf++ = '\\';
-
-	  *buf++ = *c;
-	  c++;
+	  grub_memcpy(buf, c, arg_size);
+	  buf += arg_size - 1;
 	}
+      else
+	{
+	  if (space)
+	    *buf++ = '"';
 
-      if (space)
-	*buf++ = '"';
+	  while (*c)
+	    {
+	      if (*c == '\\' || *c == '\'' || *c == '"')
+		*buf++ = '\\';
 
+	      *buf++ = *c;
+	      c++;
+	    }
+
+	  if (space)
+	    *buf++ = '"';
+	}
       *buf++ = ' ';
     }
 
diff --git a/grub-core/loader/arm/linux.c b/grub-core/loader/arm/linux.c
index 19ddedbc2..6a052a0da 100644
--- a/grub-core/loader/arm/linux.c
+++ b/grub-core/loader/arm/linux.c
@@ -375,7 +375,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
 
   grub_loader_set (linux_boot, linux_unload, 0);
 
-  size = grub_loader_cmdline_size (argc, argv);
+  size = grub_loader_cmdline_size (argc, argv, 0);
   linux_args = grub_malloc (size + sizeof (LINUX_IMAGE));
   if (!linux_args)
     {
@@ -387,7 +387,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
   grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE));
   err = grub_create_loader_cmdline (argc, argv,
 				    linux_args + sizeof (LINUX_IMAGE) - 1, size,
-				    GRUB_VERIFY_KERNEL_CMDLINE);
+				    GRUB_VERIFY_KERNEL_CMDLINE, 0);
   if (err)
     goto fail;
 
diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c
index 26e1472c9..7b55742f5 100644
--- a/grub-core/loader/arm64/xen_boot.c
+++ b/grub-core/loader/arm64/xen_boot.c
@@ -345,7 +345,7 @@ xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file,
 
   if (argc > 1)
     {
-      binary->cmdline_size = grub_loader_cmdline_size (argc - 1, argv + 1);
+      binary->cmdline_size = grub_loader_cmdline_size (argc - 1, argv + 1, 0);
       binary->cmdline = grub_zalloc (binary->cmdline_size);
       if (!binary->cmdline)
 	{
@@ -355,7 +355,7 @@ xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file,
 	}
       grub_create_loader_cmdline (argc - 1, argv + 1, binary->cmdline,
 				  binary->cmdline_size,
-				  GRUB_VERIFY_KERNEL_CMDLINE);
+				  GRUB_VERIFY_KERNEL_CMDLINE, 0);
       grub_dprintf ("xen_loader",
 		    "Xen_boot cmdline @ %p %s, size: %d\n",
 		    binary->cmdline, binary->cmdline, binary->cmdline_size);
diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
index bfbd95aee..dc94a9572 100644
--- a/grub-core/loader/efi/linux.c
+++ b/grub-core/loader/efi/linux.c
@@ -533,7 +533,7 @@ fallback:
 
   grub_dprintf ("linux", "kernel @ %p\n", kernel_addr);
 
-  cmdline_size = grub_loader_cmdline_size (argc, argv) + sizeof (LINUX_IMAGE);
+  cmdline_size = grub_loader_cmdline_size (argc, argv, 0) + sizeof (LINUX_IMAGE);
   linux_args = grub_malloc (cmdline_size);
   if (!linux_args)
     {
@@ -544,7 +544,7 @@ fallback:
   err = grub_create_loader_cmdline (argc, argv,
 				    linux_args + sizeof (LINUX_IMAGE) - 1,
 				    cmdline_size,
-				    GRUB_VERIFY_KERNEL_CMDLINE);
+				    GRUB_VERIFY_KERNEL_CMDLINE, 0);
   if (err)
     goto fail;
 
diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
index 977757f2c..66a9a7136 100644
--- a/grub-core/loader/i386/linux.c
+++ b/grub-core/loader/i386/linux.c
@@ -1013,7 +1013,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
 				      + sizeof (LINUX_IMAGE) - 1,
 				      maximal_cmdline_size
 				      - (sizeof (LINUX_IMAGE) - 1),
-				      GRUB_VERIFY_KERNEL_CMDLINE);
+				      GRUB_VERIFY_KERNEL_CMDLINE, 0);
     if (err)
       goto fail;
   }
diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c
index bdaf67ad0..326827089 100644
--- a/grub-core/loader/i386/multiboot_mbi.c
+++ b/grub-core/loader/i386/multiboot_mbi.c
@@ -668,7 +668,7 @@ grub_multiboot_init_mbi (int argc, char *argv[])
 
   grub_multiboot_free_mbi ();
 
-  len = grub_loader_cmdline_size (argc, argv);
+  len = grub_loader_cmdline_size (argc, argv, 0);
 
   cmdline = grub_malloc (len);
   if (! cmdline)
@@ -676,7 +676,7 @@ 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);
+				     cmdline_size, GRUB_VERIFY_KERNEL_CMDLINE, 0);
 }
 
 grub_err_t
@@ -694,7 +694,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);
+  len = grub_loader_cmdline_size (argc, argv, 0);
 
   newmod->cmdline = grub_malloc (len);
   if (! newmod->cmdline)
@@ -706,7 +706,7 @@ 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);
+				    newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, 0);
   if (err)
     {
       grub_free (newmod);
diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c
index 4adeee9ae..e2209cdbe 100644
--- a/grub-core/loader/i386/pc/linux.c
+++ b/grub-core/loader/i386/pc/linux.c
@@ -345,7 +345,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
 				    + GRUB_LINUX_CL_OFFSET + sizeof (LINUX_IMAGE) - 1,
 				    maximal_cmdline_size
 				    - (sizeof (LINUX_IMAGE) - 1),
-				    GRUB_VERIFY_KERNEL_CMDLINE);
+				    GRUB_VERIFY_KERNEL_CMDLINE, 0);
   if (err)
     goto fail;
 
diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c
index 3b856e842..d24ef151b 100644
--- a/grub-core/loader/i386/xen.c
+++ b/grub-core/loader/i386/xen.c
@@ -650,7 +650,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
   err = grub_create_loader_cmdline (argc - 1, argv + 1,
 				    (char *) xen_state.next_start.cmd_line,
 				    sizeof (xen_state.next_start.cmd_line) - 1,
-				    GRUB_VERIFY_KERNEL_CMDLINE);
+				    GRUB_VERIFY_KERNEL_CMDLINE, 0);
   if (err)
     return err;
 
@@ -910,7 +910,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
     return grub_errno;
   size = grub_file_size (file);
 
-  cmdline_len = grub_loader_cmdline_size (argc - 1, argv + 1);
+  cmdline_len = grub_loader_cmdline_size (argc - 1, argv + 1, 0);
 
   err = grub_relocator_alloc_chunk_addr (xen_state.relocator, &ch,
 					 xen_state.max_addr, cmdline_len);
@@ -919,7 +919,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
 
   err = grub_create_loader_cmdline (argc - 1, argv + 1,
 				    get_virtual_current_address (ch), cmdline_len,
-				    GRUB_VERIFY_MODULE_CMDLINE);
+				    GRUB_VERIFY_MODULE_CMDLINE, 0);
   if (err)
     goto fail;
 
diff --git a/grub-core/loader/mips/linux.c b/grub-core/loader/mips/linux.c
index 7264ba2b6..dedf61280 100644
--- a/grub-core/loader/mips/linux.c
+++ b/grub-core/loader/mips/linux.c
@@ -304,7 +304,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
 
 #ifdef GRUB_MACHINE_MIPS_QEMU_MIPS
   /* Create kernel command line.  */
-  size = grub_loader_cmdline_size(argc, argv);
+  size = grub_loader_cmdline_size(argc, argv, 0);
   params = grub_malloc (size + sizeof (LINUX_IMAGE));
   if (! params)
     {
@@ -314,7 +314,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
 
   grub_memcpy (params, LINUX_IMAGE, sizeof (LINUX_IMAGE));
   grub_create_loader_cmdline (argc, argv, params + sizeof (LINUX_IMAGE) - 1,
-			      size, GRUB_VERIFY_KERNEL_CMDLINE);
+			      size, GRUB_VERIFY_KERNEL_CMDLINE, 0);
 #else
   linux_argv = extra;
   argv_off = (grub_uint8_t *) linux_argv - (grub_uint8_t *) playground;
diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c
index 00a48413c..8a81a0359 100644
--- a/grub-core/loader/multiboot_mbi2.c
+++ b/grub-core/loader/multiboot_mbi2.c
@@ -1037,7 +1037,7 @@ grub_multiboot2_init_mbi (int argc, char *argv[])
 
   grub_multiboot2_free_mbi ();
 
-  len = grub_loader_cmdline_size (argc, argv);
+  len = grub_loader_cmdline_size (argc, argv, 0);
 
   cmdline = grub_malloc (len);
   if (! cmdline)
@@ -1045,7 +1045,7 @@ 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);
+				     GRUB_VERIFY_KERNEL_CMDLINE, 0);
 }
 
 grub_err_t
@@ -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);
+  len = grub_loader_cmdline_size (argc, argv, 0);
 
   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);
+				    newmod->cmdline_size, GRUB_VERIFY_MODULE_CMDLINE, 0);
   if (err)
     {
       grub_free (newmod->cmdline);
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
index 4864e5fb0..45461f26a 100644
--- a/grub-core/loader/powerpc/ieee1275/linux.c
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
@@ -306,7 +306,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
       goto out;
     }
 
-  size = grub_loader_cmdline_size(argc, argv);
+  size = grub_loader_cmdline_size(argc, argv, 0);
   linux_args = grub_malloc (size + sizeof (LINUX_IMAGE));
   if (! linux_args)
     goto out;
@@ -314,7 +314,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
   /* Create kernel command line.  */
   grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE));
   if (grub_create_loader_cmdline (argc, argv, linux_args + sizeof (LINUX_IMAGE) - 1,
-				  size, GRUB_VERIFY_KERNEL_CMDLINE))
+				  size, GRUB_VERIFY_KERNEL_CMDLINE, 0))
     goto out;
 
 out:
diff --git a/grub-core/loader/sparc64/ieee1275/linux.c b/grub-core/loader/sparc64/ieee1275/linux.c
index ac2206f3c..de31a0792 100644
--- a/grub-core/loader/sparc64/ieee1275/linux.c
+++ b/grub-core/loader/sparc64/ieee1275/linux.c
@@ -332,7 +332,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
       goto out;
     }
 
-  size = grub_loader_cmdline_size(argc, argv);
+  size = grub_loader_cmdline_size(argc, argv, 0);
 
   linux_args = grub_malloc (size + sizeof (LINUX_IMAGE));
   if (! linux_args)
@@ -341,7 +341,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
   /* Create kernel command line.  */
   grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE));
   if (grub_create_loader_cmdline (argc, argv, linux_args + sizeof (LINUX_IMAGE) - 1,
-				  size, GRUB_VERIFY_KERNEL_CMDLINE))
+				  size, GRUB_VERIFY_KERNEL_CMDLINE, 0))
     goto out;
 
 out:
diff --git a/include/grub/lib/cmdline.h b/include/grub/lib/cmdline.h
index cdca09b7a..c1210ec21 100644
--- a/include/grub/lib/cmdline.h
+++ b/include/grub/lib/cmdline.h
@@ -25,8 +25,9 @@
 
 #define LINUX_IMAGE "BOOT_IMAGE="
 
-unsigned int grub_loader_cmdline_size (int argc, char *argv[]);
+unsigned int grub_loader_cmdline_size (int argc, char *argv[], int noescape);
 grub_err_t grub_create_loader_cmdline (int argc, char *argv[], char *buf,
-				       grub_size_t size, enum grub_verify_string_type type);
+				       grub_size_t size, enum grub_verify_string_type type,
+				       int noescape);
 
 #endif /* ! GRUB_CMDLINE_HEADER */
-- 
2.39.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH vRESEND 2/4] loader/multiboot: Add --noescape option
  2024-05-17  7:52 [PATCH vRESEND 1/4] Add "noescape" argument to cmdline creation Vladimir Serbinenko
@ 2024-05-17  7:52 ` Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 3/4] loader/xen: " Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 4/4] 10_illumos: Use --noescape so that $ZFS_BOOTFS is passed properly Vladimir Serbinenko
  2 siblings, 0 replies; 4+ messages in thread
From: Vladimir Serbinenko @ 2024-05-17  7:52 UTC (permalink / raw)
  To: grub-devel; +Cc: Vladimir Serbinenko

This is needed to boot Solaris/Illumos on some boot paths that need quotes.

Signed-off-by: Vladimir Serbinenko <phcoder@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 326827089..8541afc1d 100644
--- a/grub-core/loader/i386/multiboot_mbi.c
+++ b/grub-core/loader/i386/multiboot_mbi.c
@@ -662,13 +662,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)
@@ -676,12 +676,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;
@@ -694,7 +694,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)
@@ -706,7 +706,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.39.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH vRESEND 3/4] loader/xen: Add --noescape option.
  2024-05-17  7:52 [PATCH vRESEND 1/4] Add "noescape" argument to cmdline creation Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 2/4] loader/multiboot: Add --noescape option Vladimir Serbinenko
@ 2024-05-17  7:52 ` Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 4/4] 10_illumos: Use --noescape so that $ZFS_BOOTFS is passed properly Vladimir Serbinenko
  2 siblings, 0 replies; 4+ messages in thread
From: Vladimir Serbinenko @ 2024-05-17  7:52 UTC (permalink / raw)
  To: grub-devel; +Cc: Vladimir Serbinenko

---
 grub-core/loader/i386/xen.c | 43 +++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c
index d24ef151b..12d920294 100644
--- a/grub-core/loader/i386/xen.c
+++ b/grub-core/loader/i386/xen.c
@@ -638,6 +638,14 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
   grub_addr_t kern_start;
   grub_addr_t kern_end;
   grub_size_t sz;
+  int no_escape = 0;
+
+  if (argc != 0 && grub_strcmp (argv[0], "--noescape") == 0)
+    {
+      argc--;
+      argv++;
+      no_escape = 1;
+    }
 
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
@@ -650,7 +658,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
   err = grub_create_loader_cmdline (argc - 1, argv + 1,
 				    (char *) xen_state.next_start.cmd_line,
 				    sizeof (xen_state.next_start.cmd_line) - 1,
-				    GRUB_VERIFY_KERNEL_CMDLINE, 0);
+				    GRUB_VERIFY_KERNEL_CMDLINE, no_escape);
   if (err)
     return err;
 
@@ -845,17 +853,30 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
   grub_relocator_chunk_t ch;
   grub_size_t cmdline_len;
   int nounzip = 0;
+  int option_found = 0;
+  int no_escape = 0;
   grub_file_t file;
 
-  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;
+	  no_escape = 1;
+	}
+    } while (option_found);
 
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
@@ -910,7 +931,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
     return grub_errno;
   size = grub_file_size (file);
 
-  cmdline_len = grub_loader_cmdline_size (argc - 1, argv + 1, 0);
+  cmdline_len = grub_loader_cmdline_size (argc - 1, argv + 1, no_escape);
 
   err = grub_relocator_alloc_chunk_addr (xen_state.relocator, &ch,
 					 xen_state.max_addr, cmdline_len);
@@ -919,7 +940,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
 
   err = grub_create_loader_cmdline (argc - 1, argv + 1,
 				    get_virtual_current_address (ch), cmdline_len,
-				    GRUB_VERIFY_MODULE_CMDLINE, 0);
+				    GRUB_VERIFY_MODULE_CMDLINE, no_escape);
   if (err)
     goto fail;
 
-- 
2.39.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH vRESEND 4/4] 10_illumos: Use --noescape so that $ZFS_BOOTFS is passed properly
  2024-05-17  7:52 [PATCH vRESEND 1/4] Add "noescape" argument to cmdline creation Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 2/4] loader/multiboot: Add --noescape option Vladimir Serbinenko
  2024-05-17  7:52 ` [PATCH vRESEND 3/4] loader/xen: " Vladimir Serbinenko
@ 2024-05-17  7:52 ` Vladimir Serbinenko
  2 siblings, 0 replies; 4+ messages in thread
From: Vladimir Serbinenko @ 2024-05-17  7:52 UTC (permalink / raw)
  To: grub-devel; +Cc: Vladimir Serbinenko

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
---
 util/grub.d/10_illumos.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/util/grub.d/10_illumos.in b/util/grub.d/10_illumos.in
index a133e1b3f..5649e441f 100644
--- a/util/grub.d/10_illumos.in
+++ b/util/grub.d/10_illumos.in
@@ -47,7 +47,7 @@ message="$(gettext_printf "Loading kernel of Illumos ...")"
 	fi
 	zfs-bootfs $($grub_mkrelpath /) ZFS_BOOTFS
         echo '$(echo "$message" | grub_quote)'
-	multiboot $($grub_mkrelpath /platform/i86pc/kernel)/\$ISADIR/unix /platform/i86pc/kernel/\$ISADIR/unix -B \$ZFS_BOOTFS,console=text
+	multiboot --noescape $($grub_mkrelpath /platform/i86pc/kernel)/\$ISADIR/unix /platform/i86pc/kernel/\$ISADIR/unix -B \$ZFS_BOOTFS,console=text
 	module $($grub_mkrelpath /platform/i86pc)/\$ISADIR/boot_archive /platform/i86pc/\$ISADIR/boot_archive
 }
 EOF
-- 
2.39.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-05-17  7:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-17  7:52 [PATCH vRESEND 1/4] Add "noescape" argument to cmdline creation Vladimir Serbinenko
2024-05-17  7:52 ` [PATCH vRESEND 2/4] loader/multiboot: Add --noescape option Vladimir Serbinenko
2024-05-17  7:52 ` [PATCH vRESEND 3/4] loader/xen: " Vladimir Serbinenko
2024-05-17  7:52 ` [PATCH vRESEND 4/4] 10_illumos: Use --noescape so that $ZFS_BOOTFS is passed properly Vladimir Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.