1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-12 13:18:14 +03:00

tmpfiles: with "e" don't attempt to set permissions when file doesn't exist (#6682)

tmpfiles.d option "e" when run through systemd-tmpfiles --create should
apply configured permissions (uid,gid) only to already existing
files. When file doesn't exist we bail out with error. Instead we should
silently ignore non-existing files.

$ useradd test
$ cat /etc/tmpfiles.d/foobar.conf
e /tmp/test - test test 1d
$ ls -l /tmp/test
ls: cannot access '/tmp/test': No such file or directory

Before:
$ systemd-tmpfiles --create /etc/tmpfiles.d/foobar.conf
Adjusting owner and mode for /tmp/test failed: No such file or directory
$ echo $?
1

After:
$ systemd-tmpfiles --create /etc/tmpfiles.d/foobar.conf
$ echo $?
0
This commit is contained in:
Michal Sekletar 2017-08-31 12:45:25 +02:00 committed by Lennart Poettering
parent 617da14cfd
commit 780e2ee187

View File

@ -617,8 +617,20 @@ static int path_set_perms(Item *i, const char *path) {
* O_PATH. */
fd = open(path, O_NOFOLLOW|O_CLOEXEC|O_PATH);
if (fd < 0)
return log_error_errno(errno, "Adjusting owner and mode for %s failed: %m", path);
if (fd < 0) {
int level = LOG_ERR, r = -errno;
/* Option "e" operates only on existing objects. Do not
* print errors about non-existent files or directories */
if (i->type == EMPTY_DIRECTORY && errno == ENOENT) {
level = LOG_DEBUG;
r = 0;
}
log_full_errno(level, errno, "Adjusting owner and mode for %s failed: %m", path);
return r;
}
if (fstatat(fd, "", &st, AT_EMPTY_PATH) < 0)
return log_error_errno(errno, "Failed to fstat() file %s: %m", path);