mirror of
https://github.com/systemd/systemd.git
synced 2025-01-13 17:18:18 +03:00
Merge pull request #26245 from ldv-alt/tmpfiles-fixes
tmpfiles: fix specifier expansion in arguments of C and L lines
This commit is contained in:
commit
e9125200ac
@ -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:
|
||||
@ -3334,34 +3328,6 @@ static int parse_line(
|
||||
*invalid_config = true;
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG), "base64 decoding not supported for copy sources.");
|
||||
}
|
||||
|
||||
if (!i.argument) {
|
||||
i.argument = path_join("/usr/share/factory", i.path);
|
||||
if (!i.argument)
|
||||
return log_oom();
|
||||
} else if (!path_is_absolute(i.argument)) {
|
||||
*invalid_config = true;
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG), "Source path '%s' is not absolute.", i.argument);
|
||||
|
||||
}
|
||||
|
||||
if (!empty_or_root(arg_root)) {
|
||||
char *p;
|
||||
|
||||
p = path_join(arg_root, i.argument);
|
||||
if (!p)
|
||||
return log_oom();
|
||||
free_and_replace(i.argument, p);
|
||||
}
|
||||
|
||||
path_simplify(i.argument);
|
||||
|
||||
if (laccess(i.argument, F_OK) == -ENOENT) {
|
||||
/* Silently skip over lines where the source file is missing. */
|
||||
log_syntax(NULL, LOG_DEBUG, fname, line, 0, "Copy source path '%s' does not exist, skipping line.", i.argument);
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CREATE_CHAR_DEVICE:
|
||||
@ -3455,6 +3421,49 @@ 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);
|
||||
if (!i.argument)
|
||||
return log_oom();
|
||||
} else if (!path_is_absolute(i.argument)) {
|
||||
*invalid_config = true;
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG), "Source path '%s' is not absolute.", i.argument);
|
||||
|
||||
}
|
||||
|
||||
if (!empty_or_root(arg_root)) {
|
||||
char *p;
|
||||
|
||||
p = path_join(arg_root, i.argument);
|
||||
if (!p)
|
||||
return log_oom();
|
||||
free_and_replace(i.argument, p);
|
||||
}
|
||||
|
||||
path_simplify(i.argument);
|
||||
|
||||
if (laccess(i.argument, F_OK) == -ENOENT) {
|
||||
/* Silently skip over lines where the source file is missing. */
|
||||
log_syntax(NULL, LOG_DEBUG, fname, line, 0, "Copy source path '%s' does not exist, skipping line.", i.argument);
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (from_cred) {
|
||||
if (!i.argument)
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), "Reading from credential requested, but no credential name specified.");
|
||||
|
@ -97,7 +97,7 @@ test "$(stat -c %U:%G:%a /tmp/e/3/f1)" = "root:root:644"
|
||||
# 'C'
|
||||
#
|
||||
|
||||
mkdir /tmp/C/{1,2,3}-origin
|
||||
mkdir /tmp/C/{0,1,2,3}-origin
|
||||
touch /tmp/C/{1,2,3}-origin/f1
|
||||
chmod 755 /tmp/C/{1,2,3}-origin/f1
|
||||
|
||||
@ -121,3 +121,31 @@ EOF
|
||||
|
||||
test "$(stat -c %U:%G:%a /tmp/C/3/f1)" = "root:root:644"
|
||||
test ! -e /tmp/C/4
|
||||
|
||||
# Check that %U expands to 0, both in the path and in the argument.
|
||||
home='/tmp/C'
|
||||
systemd-tmpfiles --create - <<EOF
|
||||
C $home/%U - - - - $home/%U-origin
|
||||
EOF
|
||||
|
||||
test -d "$home/0"
|
||||
|
||||
# Check that %h expands to $home, both in the path and in the argument.
|
||||
HOME="$home" \
|
||||
systemd-tmpfiles --create - <<EOF
|
||||
C %h/5 - - - - %h/3-origin
|
||||
EOF
|
||||
|
||||
test -f "$home/5/f1"
|
||||
|
||||
# Check that %h in the path is expanded, but
|
||||
# the result of this expansion is not expanded once again.
|
||||
root='/tmp/C/6'
|
||||
home='/%U'
|
||||
mkdir -p "$root/usr/share/factory$home"
|
||||
HOME="$home" \
|
||||
systemd-tmpfiles --create --root="$root" - <<EOF
|
||||
C %h - - - -
|
||||
EOF
|
||||
|
||||
test -d "$root$home"
|
||||
|
32
test/units/testsuite-22.15.sh
Executable file
32
test/units/testsuite-22.15.sh
Executable file
@ -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"
|
Loading…
Reference in New Issue
Block a user