From 0e9f4d38b19c2d7557528ef5b11b93377525cd55 Mon Sep 17 00:00:00 2001 From: Brett Grandbois Date: Mon, 11 Jun 2018 07:54:08 +1000 Subject: discover/syslinux-parser: consistent cmdline arg processing In signed-boot environments consistent handling of kernel commandline options is essential as they must be pre-signed. In the syslinux parser ensure that in the absence of a global APPEND they are processed exactly as found and not with the leading space that the current APPEND processing has as a shortcut. Signed-off-by: Brett Grandbois Signed-off-by: Samuel Mendoza-Jonas --- discover/syslinux-parser.c | 11 +++++------ test/parser/test-syslinux-explicit.c | 2 +- test/parser/test-syslinux-global-append.c | 19 +++++++++++++++---- test/parser/test-syslinux-single-yocto.c | 2 +- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c index c611ac9..defafd2 100644 --- a/discover/syslinux-parser.c +++ b/discover/syslinux-parser.c @@ -338,11 +338,13 @@ static void syslinux_finalize(struct conf_context *conf) /* '-' can signal do not use global APPEND */ if (!strcmp(syslinux_opt->append, "-")) opt->boot_args = talloc_strdup(opt, ""); - else + else if (global_append) opt->boot_args = talloc_asprintf(opt, "%s %s", global_append, syslinux_opt->append); - } else + else + opt->boot_args = talloc_strdup(opt, syslinux_opt->append); + } else if (global_append) opt->boot_args = talloc_strdup(opt, global_append); if (!opt->boot_args) @@ -455,13 +457,10 @@ static int syslinux_parse(struct discover_context *dc) /* * set the global defaults * by spec 'default' defaults to 'linux' and - * 'implicit' defaults to '1', we also just set - * and empty string in 'append' to make it easier - * in syslinux_finish + * 'implicit' defaults to '1' */ conf_set_global_option(conf, "default", "linux"); conf_set_global_option(conf, "implicit", "1"); - conf_set_global_option(conf, "append", ""); for (filename = syslinux_conf_files; *filename; filename++) { /* diff --git a/test/parser/test-syslinux-explicit.c b/test/parser/test-syslinux-explicit.c index 5d23f50..82030bf 100644 --- a/test/parser/test-syslinux-explicit.c +++ b/test/parser/test-syslinux-explicit.c @@ -36,6 +36,6 @@ void run_test(struct parser_test *test) check_name(opt, "backup"); check_resolved_local_resource(opt->boot_image, ctx->device, "/backup/vmlinuz"); - check_args(opt, " root=/dev/sdb"); + check_args(opt, "root=/dev/sdb"); check_resolved_local_resource(opt->initrd, ctx->device, "/boot/initrd"); } diff --git a/test/parser/test-syslinux-global-append.c b/test/parser/test-syslinux-global-append.c index 18af99a..af2e9af 100644 --- a/test/parser/test-syslinux-global-append.c +++ b/test/parser/test-syslinux-global-append.c @@ -18,6 +18,9 @@ LABEL hyphen KERNEL /test/vmlinuz APPEND - +LABEL onlyglobal +KERNEL /only/vmlinuz + #endif void run_test(struct parser_test *test) @@ -31,8 +34,9 @@ void run_test(struct parser_test *test) ctx = test->ctx; - check_boot_option_count(ctx, 3); - opt = get_boot_option(ctx, 2); + check_boot_option_count(ctx, 4); + + opt = get_boot_option(ctx, 3); check_name(opt, "linux"); check_resolved_local_resource(opt->boot_image, ctx->device, "/vmlinuz"); @@ -40,17 +44,24 @@ void run_test(struct parser_test *test) check_args(opt, "console=ttyS0 console=tty0"); check_not_present_resource(opt->initrd); - opt = get_boot_option(ctx, 1); + opt = get_boot_option(ctx, 2); check_name(opt, "backup"); check_resolved_local_resource(opt->boot_image, ctx->device, "/backup/vmlinuz"); check_args(opt, "console=ttyS0 root=/dev/sdb"); check_resolved_local_resource(opt->initrd, ctx->device, "/boot/initrd"); - opt = get_boot_option(ctx, 0); + opt = get_boot_option(ctx, 1); check_name(opt, "hyphen"); check_resolved_local_resource(opt->boot_image, ctx->device, "/test/vmlinuz"); check_args(opt, ""); check_not_present_resource(opt->initrd); + + opt = get_boot_option(ctx, 0); + + check_name(opt, "onlyglobal"); + check_resolved_local_resource(opt->boot_image, ctx->device, "/only/vmlinuz"); + check_args(opt, "console=ttyS0"); + check_not_present_resource(opt->initrd); } diff --git a/test/parser/test-syslinux-single-yocto.c b/test/parser/test-syslinux-single-yocto.c index e5e084d..dd26577 100644 --- a/test/parser/test-syslinux-single-yocto.c +++ b/test/parser/test-syslinux-single-yocto.c @@ -32,5 +32,5 @@ void run_test(struct parser_test *test) check_name(opt, "boot"); check_resolved_local_resource(opt->boot_image, ctx->device, "/vmlinuz"); check_is_default(opt); - check_args(opt, " console=ttyS0,115200n8 console=tty0"); + check_args(opt, "console=ttyS0,115200n8 console=tty0"); } -- cgit v1.2.1