core: reorder systemd arguments on reexec

When reexecuting system let's put our arguments carrying deserialization
info first followed by any existing arguments to make sure they get
parsed in case we get weird stuff from the kernel cmdline (like --).

See: https://github.com/systemd/systemd/issues/28184
This commit is contained in:
Frantisek Sumsal 2023-06-29 13:31:19 +02:00 committed by Luca Boccassi
parent 88d2bda812
commit 06afda6b38
2 changed files with 10 additions and 1 deletions

View file

@ -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);

View file

@ -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"