]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mount-util: make sure get_mount_flags() ever follows symlinks
authorLennart Poettering <lennart@poettering.net>
Tue, 22 Sep 2020 13:16:37 +0000 (15:16 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 23 Sep 2020 16:57:36 +0000 (18:57 +0200)
It doesn't follow symlinks when we check for the mount flags via
libmount, hence it shouldn't do either when we go via statvfs().

src/shared/mount-util.c

index 76308a8b0653af9b6f669b39db9ac14cee29ef70..0b76b77430f085d5532c66314b218feadc283f46 100644 (file)
@@ -129,14 +129,18 @@ static int get_mount_flags(
                 struct libmnt_table *table,
                 const char *path,
                 unsigned long *ret) {
+
+        _cleanup_close_ int fd = -1;
         struct libmnt_fs *fs;
         struct statvfs buf;
         const char *opts;
-        int r = 0;
+        int r;
 
         /* Get the mount flags for the mountpoint at "path" from "table". We have a fallback using statvfs()
          * in place (which provides us with mostly the same info), but it's just a fallback, since using it
-         * means triggering autofs or NFS mounts, which we'd rather avoid needlessly. */
+         * means triggering autofs or NFS mounts, which we'd rather avoid needlessly.
+         *
+         * This generally doesn't follow symlinks. */
 
         fs = mnt_table_find_target(table, path, MNT_ITER_FORWARD);
         if (!fs) {
@@ -161,7 +165,11 @@ static int get_mount_flags(
         return 0;
 
 fallback:
-        if (statvfs(path, &buf) < 0)
+        fd = open(path, O_PATH|O_CLOEXEC|O_NOFOLLOW);
+        if (fd < 0)
+                return -errno;
+
+        if (fstatvfs(fd, &buf) < 0)
                 return -errno;
 
         /* The statvfs() flags and the mount flags mostly have the same values, but for some cases do