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. */
}
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)
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;
}
+ else
+ {
+ if (space)
+ *buf++ = '"';
- if (space)
- *buf++ = '"';
+ while (*c)
+ {
+ if (*c == '\\' || *c == '\'' || *c == '"')
+ *buf++ = '\\';
+ *buf++ = *c;
+ c++;
+ }
+
+ if (space)
+ *buf++ = '"';
+ }
*buf++ = ' ';
}
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)
{
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;
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)
{
}
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);
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)
{
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;
+ sizeof (LINUX_IMAGE) - 1,
maximal_cmdline_size
- (sizeof (LINUX_IMAGE) - 1),
- GRUB_VERIFY_KERNEL_CMDLINE);
+ GRUB_VERIFY_KERNEL_CMDLINE, 0);
if (err)
goto fail;
}
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)
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
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)
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);
+ 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;
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;
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);
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;
#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)
{
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;
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)
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
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)
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);
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;
/* 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:
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)
/* 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:
#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 */