diff --git a/src/core/main.c b/src/core/main.c index 208d22f4f3..3f78f035d0 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1860,12 +1860,16 @@ static int do_reexecute( xsprintf(sfd, "--deserialize=%i", fileno(arg_serialization)); i = 1; /* Leave args[0] empty for now. */ - filter_args(args, &i, argv, argc); + /* Put our stuff first to make sure it always gets parsed in case + * we get weird stuff from the kernel cmdline (like --) */ if (IN_SET(objective, MANAGER_SWITCH_ROOT, MANAGER_SOFT_REBOOT)) args[i++] = "--switched-root"; args[i++] = runtime_scope_cmdline_option_to_string(arg_runtime_scope); args[i++] = sfd; + + filter_args(args, &i, argv, argc); + args[i++] = NULL; assert(i <= args_size); diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh index cc6d0651c1..d0e714ac30 100755 --- a/test/TEST-01-BASIC/test.sh +++ b/test/TEST-01-BASIC/test.sh @@ -8,6 +8,11 @@ RUN_IN_UNPRIVILEGED_CONTAINER=${RUN_IN_UNPRIVILEGED_CONTAINER:-yes} TEST_REQUIRE_INSTALL_TESTS=0 TEST_SUPPORTING_SERVICES_SHOULD_BE_MASKED=0 +# Check if we can correctly deserialize if the kernel cmdline contains "weird" stuff +# like an invalid argument, "end of arguments" separator, or a sysvinit argument (-z) +# See: https://github.com/systemd/systemd/issues/28184 +KERNEL_APPEND="foo -- -z bar --- baz $KERNEL_APPEND" + # shellcheck source=test/test-functions . "${TEST_BASE_DIR:?}/test-functions"