summaryrefslogtreecommitdiff
path: root/backport-core-escape-spaces-when-serializing-as-well.patch
diff options
context:
space:
mode:
Diffstat (limited to 'backport-core-escape-spaces-when-serializing-as-well.patch')
-rw-r--r--backport-core-escape-spaces-when-serializing-as-well.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/backport-core-escape-spaces-when-serializing-as-well.patch b/backport-core-escape-spaces-when-serializing-as-well.patch
new file mode 100644
index 0000000..7d3328e
--- /dev/null
+++ b/backport-core-escape-spaces-when-serializing-as-well.patch
@@ -0,0 +1,77 @@
+From 5b1aa0e19a6df603336894604a85df74204d04f9 Mon Sep 17 00:00:00 2001
+From: Frantisek Sumsal <frantisek@sumsal.cz>
+Date: Mon, 12 Feb 2024 18:32:03 +0100
+Subject: [PATCH] core: escape spaces when serializing as well
+
+Otherwise they might get stripped when reading the serialized data back.
+
+Resolves: #31214
+
+Conflict:NA
+Reference:https://github.com/systemd/systemd/commit/5b1aa0e19a6df603336894604a85df74204d04f9
+
+---
+ src/shared/serialize.c | 2 +-
+ test/units/testsuite-07.exec-context.sh | 33 +++++++++++++++++++++++++
+ 2 files changed, 34 insertions(+), 1 deletion(-)
+
+diff --git a/src/shared/serialize.c b/src/shared/serialize.c
+index 7099f67f92..483cbc7419 100644
+--- a/src/shared/serialize.c
++++ b/src/shared/serialize.c
+@@ -46,7 +46,7 @@ int serialize_item_escaped(FILE *f, const char *key, const char *value) {
+ if (!value)
+ return 0;
+
+- c = cescape(value);
++ c = xescape(value, " ");
+ if (!c)
+ return log_oom();
+
+diff --git a/test/units/testsuite-07.exec-context.sh b/test/units/testsuite-07.exec-context.sh
+index dd63163008..e1e4367cc6 100755
+--- a/test/units/testsuite-07.exec-context.sh
++++ b/test/units/testsuite-07.exec-context.sh
+@@ -338,6 +338,39 @@ if [[ ! -v ASAN_OPTIONS ]] && systemctl --version | grep "+BPF_FRAMEWORK" && ker
+ (! systemd-run --wait --pipe -p RestrictFileSystems="~proc devtmpfs sysfs" ls /sys)
+ fi
+
++# Make sure we properly (de)serialize various string arrays, including whitespaces
++# See: https://github.com/systemd/systemd/issues/31214
++systemd-run --wait --pipe -p Environment="FOO='bar4 '" \
++ bash -xec '[[ $FOO == "bar4 " ]]'
++systemd-run --wait --pipe -p Environment="FOO='bar4 ' BAR='\n\n'" \
++ bash -xec "[[ \$FOO == 'bar4 ' && \$BAR == $'\n\n' ]]"
++systemd-run --wait --pipe -p Environment='FOO="bar4 \\ "' -p Environment="BAR='\n\t'" \
++ bash -xec "[[ \$FOO == 'bar4 \\ ' && \$BAR == $'\n\t' ]]"
++TEST_ENV_FILE="/tmp/test-env-file-$RANDOM- "
++cat >"$TEST_ENV_FILE" <<EOF
++FOO="env file "
++BAR="
++ "
++EOF
++systemd-run --wait --pipe cat "$TEST_ENV_FILE"
++systemd-run --wait --pipe -p ReadOnlyPaths="'$TEST_ENV_FILE'" \
++ bash -xec '[[ ! -w "$TEST_ENV_FILE" ]]'
++systemd-run --wait --pipe -p PrivateTmp=yes -p BindReadOnlyPaths="'$TEST_ENV_FILE':'/tmp/bar- '" \
++ bash -xec '[[ -e "/tmp/bar- " && ! -w "/tmp/bar- " ]]'
++systemd-run --wait --pipe -p EnvironmentFile="$TEST_ENV_FILE" \
++ bash -xec "[[ \$FOO == 'env file ' && \$BAR == $'\n ' ]]"
++rm -f "$TEST_ENV_FILE"
++# manager_serialize()/manager_deserialize() uses similar machinery
++systemctl unset-environment FOO_WITH_SPACES
++systemctl set-environment FOO_WITH_SPACES="foo " FOO_WITH_TABS="foo\t\t\t"
++systemctl show-environment
++systemctl show-environment | grep -F "FOO_WITH_SPACES=$'foo '"
++systemctl show-environment | grep -F "FOO_WITH_TABS=$'foo\\\\t\\\\t\\\\t'"
++systemctl daemon-reexec
++systemctl show-environment
++systemctl show-environment | grep -F "FOO_WITH_SPACES=$'foo '"
++systemctl show-environment | grep -F "FOO_WITH_TABS=$'foo\\\\t\\\\t\\\\t'"
++
+ # Ensure that clean-up codepaths work correctly if activation ultimately fails
+ touch /run/not-a-directory
+ mkdir /tmp/root
+--
+2.43.0
+