diff options
author | NeilBrown <neil@brown.name> | 2017-09-04 23:35:07 +1000 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2017-09-04 23:35:07 +1000 |
commit | 5c61c6352ad14bf0b392a5af2588e3ed319ad86b (patch) | |
tree | c0ae9b1072e4a46a20f3eb5db42ed1a03a6920c0 /src/basic/fs-util.c | |
parent | 4b9303ec2924f73180408479a0f160868165f756 (diff) |
tmpfiles: silently ignore any path that passes through autofs (#6506)
If a path passes though an autofs filesystem, then accessing
the path might trigger and automount. As elogind-tmpfiles is run before
the network is up, and as automounts are often used for networked
filesystems, this can cause a deadlock.
So chase_symlinks is enhance to accept a new flag which tells it
to check for autofs, and return -EREMOTE if autofs is found.
tmpfiles is changed to check just before acting on a path so that it
can avoid autofs even if a symlink was created earlier by tmpfiles
that would send this path through an autofs.
This fixes a deadlock that happens when /home is listed in /etc/fstab as
x-elogind.automount for an NFS directory.
Diffstat (limited to 'src/basic/fs-util.c')
-rw-r--r-- | src/basic/fs-util.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index cf5c80eca..c8b5ad432 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -23,6 +23,7 @@ #include <stdlib.h> #include <string.h> #include <sys/stat.h> +#include <linux/magic.h> #include <time.h> #include <unistd.h> @@ -733,6 +734,9 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, if (fstat(child, &st) < 0) return -errno; + if ((flags & CHASE_NO_AUTOFS) && + fd_check_fstype(child, AUTOFS_SUPER_MAGIC) > 0) + return -EREMOTE; if (S_ISLNK(st.st_mode)) { char *joined; |