From: Lennart Poettering Date: Tue, 23 Mar 2021 21:26:06 +0000 (+0100) Subject: mountpoint-util: a symlink is never a mount point X-Git-Tag: v249-rc1~502^2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b898474fecda9e39aa06512ef7ba358c9685d84e;p=thirdparty%2Fsystemd.git mountpoint-util: a symlink is never a mount point The various flavours of stat() basically tell us for free if something is a symlink. If it is, then it's definitely not a mount point. Use that. All other inode types can be mount point, just symlinks cannot. --- diff --git a/src/basic/mountpoint-util.c b/src/basic/mountpoint-util.c index c8f6675eb86..6d474191945 100644 --- a/src/basic/mountpoint-util.c +++ b/src/basic/mountpoint-util.c @@ -196,13 +196,15 @@ int fd_is_mount_point(int fd, const char *filename, int flags) { if (statx(fd, filename, (FLAGS_SET(flags, AT_SYMLINK_FOLLOW) ? 0 : AT_SYMLINK_NOFOLLOW) | (flags & AT_EMPTY_PATH) | - AT_NO_AUTOMOUNT, 0, &sx) < 0) { + AT_NO_AUTOMOUNT, STATX_TYPE, &sx) < 0) { if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno)) return -errno; /* If statx() is not available or forbidden, fall back to name_to_handle_at() below */ } else if (FLAGS_SET(sx.stx_attributes_mask, STATX_ATTR_MOUNT_ROOT)) /* yay! */ return FLAGS_SET(sx.stx_attributes, STATX_ATTR_MOUNT_ROOT); + else if (FLAGS_SET(sx.stx_mask, STATX_TYPE) && S_ISLNK(sx.stx_mode)) + return false; /* symlinks are never mount points */ r = name_to_handle_at_loop(fd, filename, &h, &mount_id, flags); if (IN_SET(r, -ENOSYS, -EACCES, -EPERM, -EOVERFLOW, -EINVAL)) @@ -280,6 +282,8 @@ fallback_fstat: flags |= AT_SYMLINK_NOFOLLOW; if (fstatat(fd, filename, &a, flags) < 0) return -errno; + if (S_ISLNK(a.st_mode)) /* Symlinks are never mount points */ + return false; if (fstatat(fd, "", &b, AT_EMPTY_PATH) < 0) return -errno;