From: Lennart Poettering Date: Tue, 22 Sep 2020 13:16:37 +0000 (+0200) Subject: mount-util: make sure get_mount_flags() ever follows symlinks X-Git-Tag: v247-rc1~183^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5012d567a8e903693998fe9fb96a5aa86f49c986;p=thirdparty%2Fsystemd.git mount-util: make sure get_mount_flags() ever follows symlinks 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(). --- diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 76308a8b065..0b76b77430f 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -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