From f0e493bf2992d752ec3cf517542e60d9ea376be4 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Sun, 30 Oct 2016 21:06:27 +0100 Subject: [PATCH] Filter bootloader supplied kernel cmdline options Various bootloader add kernel commandline options dynamically, filter these out when grabbing boot options from /proc/cmdline. Specifically grub adds BOOT_IMAGE and systemd-boot adds initrd. Closes: #560 Approved by: cgwalters --- src/libostree/ostree-kernel-args.c | 43 ++++++++++++++++++++++++++++++---- src/libostree/ostree-kernel-args.h | 3 +++ tests/test-admin-deploy-karg.sh | 2 ++ tests/test-admin-instutil-set-kargs.sh | 2 ++ 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-kernel-args.c b/src/libostree/ostree-kernel-args.c index ec189fc..22b5caa 100644 --- a/src/libostree/ostree-kernel-args.c +++ b/src/libostree/ostree-kernel-args.c @@ -53,6 +53,23 @@ split_keyeq (char *arg) } } +static gboolean +_arg_has_prefix (const char *arg, + char **prefixes) +{ + char **strviter; + + for (strviter = prefixes; strviter && *strviter; strviter++) + { + const char *prefix = *strviter; + + if (g_str_has_prefix (arg, prefix)) + return TRUE; + } + + return FALSE; +} + OstreeKernelArgs * _ostree_kernel_args_new (void) { @@ -154,18 +171,28 @@ _ostree_kernel_args_replace_argv (OstreeKernelArgs *kargs, } void -_ostree_kernel_args_append_argv (OstreeKernelArgs *kargs, - char **argv) +_ostree_kernel_args_append_argv_filtered (OstreeKernelArgs *kargs, + char **argv, + char **prefixes) { char **strviter; for (strviter = argv; strviter && *strviter; strviter++) { const char *arg = *strviter; - _ostree_kernel_args_append (kargs, arg); + + if (!_arg_has_prefix (arg, prefixes)) + _ostree_kernel_args_append (kargs, arg); } } +void +_ostree_kernel_args_append_argv (OstreeKernelArgs *kargs, + char **argv) +{ + _ostree_kernel_args_append_argv_filtered (kargs, argv, NULL); +} + gboolean _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs, GCancellable *cancellable, @@ -175,6 +202,13 @@ _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs, g_autofree char *proc_cmdline = NULL; gsize proc_cmdline_len = 0; g_auto(GStrv) proc_cmdline_args = NULL; + /* When updating the filter list don't forget to update the list in the tests + * e.g. tests/test-admin-deploy-karg.sh and + * tests/test-admin-instutil-set-kargs.sh + */ + char *filtered_prefixes[] = { "BOOT_IMAGE=", /* GRUB 2 */ + "initrd=", /* sd-boot */ + NULL }; if (!g_file_load_contents (proc_cmdline_path, cancellable, &proc_cmdline, &proc_cmdline_len, @@ -184,7 +218,8 @@ _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs, g_strchomp (proc_cmdline); proc_cmdline_args = g_strsplit (proc_cmdline, " ", -1); - _ostree_kernel_args_append_argv (kargs, proc_cmdline_args); + _ostree_kernel_args_append_argv_filtered (kargs, proc_cmdline_args, + filtered_prefixes); return TRUE; } diff --git a/src/libostree/ostree-kernel-args.h b/src/libostree/ostree-kernel-args.h index 18710d7..ceaa1ca 100644 --- a/src/libostree/ostree-kernel-args.h +++ b/src/libostree/ostree-kernel-args.h @@ -39,6 +39,9 @@ void _ostree_kernel_args_append (OstreeKernelArgs *kargs, const char *key); void _ostree_kernel_args_append_argv (OstreeKernelArgs *kargs, char **argv); +void _ostree_kernel_args_append_argv_filtered (OstreeKernelArgs *kargs, + char **argv, + char **prefixes); gboolean _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs, GCancellable *cancellable, diff --git a/tests/test-admin-deploy-karg.sh b/tests/test-admin-deploy-karg.sh index b7305f4..643aef7 100755 --- a/tests/test-admin-deploy-karg.sh +++ b/tests/test-admin-deploy-karg.sh @@ -46,6 +46,8 @@ ${CMD_PREFIX} ostree admin deploy --karg-proc-cmdline --os=testos testos:testos/ for arg in $(cat /proc/cmdline); do case "$arg" in ostree=*) # Skip ostree arg that gets stripped out + ;; + initrd=*|BOOT_IMAGE=*) # Skip options set by bootloader that gets filtered out ;; *) assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf "options.*$arg" ;; diff --git a/tests/test-admin-instutil-set-kargs.sh b/tests/test-admin-instutil-set-kargs.sh index 40f4b74..132c933 100755 --- a/tests/test-admin-instutil-set-kargs.sh +++ b/tests/test-admin-instutil-set-kargs.sh @@ -58,6 +58,8 @@ for arg in $(cat /proc/cmdline); do case "$arg" in ostree=*) # Skip ostree arg that gets stripped out ;; + initrd=*|BOOT_IMAGE=*) # Skip options set by bootloader that gets filtered out + ;; *) assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf "options.*$arg" ;; esac -- 2.10.2