]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tmpfiles: avoid double specifier expansion in L lines 26245/head
authorDmitry V. Levin <ldv@strace.io>
Sat, 29 Jan 2022 20:00:00 +0000 (20:00 +0000)
committerDmitry V. Levin <ldv@strace.io>
Sat, 29 Jan 2022 20:00:00 +0000 (20:00 +0000)
Starting with commit 2f3b873a4973, when the path contains a specifier
and the argument is omitted, tmpfiles used to perform specifier
expansions twice: first specifier expansion was applied to the path
itself, and afterwards the result of the first expansion was used
in the constructed argument and expanded once again.

Resolves: #26244
Fixes: 2f3b873a4973 ("tmpfiles: copy/link /usr/share/factory/ files when the source argument is omitted")
src/tmpfiles/tmpfiles.c
test/units/testsuite-22.15.sh [new file with mode: 0755]

index 54db55ff1f914b5d8417b34abbbc0efd4cf679aa..458aed7054163544eb5b73030697f7449cee2f88 100644 (file)
@@ -3314,12 +3314,6 @@ static int parse_line(
                         *invalid_config = true;
                         return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG), "base64 decoding not supported for symlink targets.");
                 }
-
-                if (!i.argument) {
-                        i.argument = path_join("/usr/share/factory", i.path);
-                        if (!i.argument)
-                                return log_oom();
-                }
                 break;
 
         case WRITE_FILE:
@@ -3428,6 +3422,14 @@ static int parse_line(
         }
 
         switch (i.type) {
+        case CREATE_SYMLINK:
+                if (!i.argument) {
+                        i.argument = path_join("/usr/share/factory", i.path);
+                        if (!i.argument)
+                                return log_oom();
+                }
+                break;
+
         case COPY_FILES:
                 if (!i.argument) {
                         i.argument = path_join("/usr/share/factory", i.path);
diff --git a/test/units/testsuite-22.15.sh b/test/units/testsuite-22.15.sh
new file mode 100755 (executable)
index 0000000..6cbb498
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Check specifier expansion in L lines.
+#
+set -eux
+
+rm -fr /tmp/L
+mkdir  /tmp/L
+
+# Check that %h expands to $home.
+home='/somewhere'
+dst='/tmp/L/1'
+src="$home"
+HOME="$home" \
+systemd-tmpfiles --create - <<EOF
+L     $dst    - - - - %h
+EOF
+test "$(readlink "$dst")" = "$src"
+
+# Check that %h in the path is expanded, but
+# the result of this expansion is not expanded once again.
+root='/tmp/L/2'
+home='/%U'
+src="/usr/share/factory$home"
+mkdir -p "$root$src"
+dst="$root$home"
+HOME="$home" \
+systemd-tmpfiles --create --root="$root" - <<EOF
+L     %h    - - - -
+EOF
+test "$(readlink "$dst")" = "$src"