1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-28 17:47:05 +03:00

pid1: fix serialization/deserialization of commmands with spaces

Fixes #12258.

This is enough to reproduce:
$ systemd-run bash -c 'sleep 10' && systemctl daemon-reload
would result in
Current command vanished from the unit file.

We would serialize as:
ExecStart 0 /usr/bin/bash /usr/bin/bash -c sleep 10000
which of course can't work.
Now we serialize as
ExecStart 0 /usr/bin/bash "/usr/bin/bash" "-c" "sleep 10".
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-07-08 14:18:46 +02:00 committed by Lennart Poettering
parent cd132992bb
commit 334c0979f3

View File

@ -2530,14 +2530,16 @@ static int service_serialize_exec_command(Unit *u, FILE *f, ExecCommand *command
return log_oom();
n = strlen(e);
if (!GREEDY_REALLOC(args, allocated, length + 1 + n + 1))
if (!GREEDY_REALLOC(args, allocated, length + 2 + n + 2))
return log_oom();
if (length > 0)
args[length++] = ' ';
args[length++] = '"';
memcpy(args + length, e, n);
length += n;
args[length++] = '"';
}
if (!GREEDY_REALLOC(args, allocated, length + 1))
@ -2682,7 +2684,7 @@ static int service_deserialize_exec_command(Unit *u, const char *key, const char
for (;;) {
_cleanup_free_ char *arg = NULL;
r = extract_first_word(&value, &arg, NULL, EXTRACT_CUNESCAPE);
r = extract_first_word(&value, &arg, NULL, EXTRACT_CUNESCAPE | EXTRACT_UNQUOTE);
if (r < 0)
return r;
if (r == 0)