]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: use mnt_stat_mountpoint() on more places
authorKarel Zak <kzak@redhat.com>
Mon, 6 Apr 2020 09:58:29 +0000 (11:58 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 6 Apr 2020 09:58:29 +0000 (11:58 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/context_mount.c
libmount/src/mountP.h
libmount/src/utils.c

index efd70502a761fb17cb7c7b76ae936ee19ff9531b..ff7ee695e4b14a06be776cfdd2c3a65a60ed29c1 100644 (file)
@@ -1757,7 +1757,7 @@ int mnt_context_get_mount_excode(
                if (!buf)
                        break;
                if (geteuid() == 0) {
-                       if (stat(tgt, &st) || !S_ISDIR(st.st_mode))
+                       if (mnt_stat_mountpoint(tgt, &st) || !S_ISDIR(st.st_mode))
                                snprintf(buf, bufsz, _("mount point is not a directory"));
                        else
                                snprintf(buf, bufsz, _("permission denied"));
@@ -1783,10 +1783,10 @@ int mnt_context_get_mount_excode(
                        snprintf(buf, bufsz, _("%s already mounted or mount point busy"), src);
                break;
        case ENOENT:
-               if (tgt && lstat(tgt, &st)) {
+               if (tgt && mnt_lstat_mountpoint(tgt, &st)) {
                        if (buf)
                                snprintf(buf, bufsz, _("mount point does not exist"));
-               } else if (tgt && stat(tgt, &st)) {
+               } else if (tgt && mnt_stat_mountpoint(tgt, &st)) {
                        if (buf)
                                snprintf(buf, bufsz, _("mount point is a symbolic link to nowhere"));
                } else if (src && stat(src, &st)) {
@@ -1801,7 +1801,7 @@ int mnt_context_get_mount_excode(
                break;
 
        case ENOTDIR:
-               if (stat(tgt, &st) || ! S_ISDIR(st.st_mode)) {
+               if (mnt_stat_mountpoint(tgt, &st) || ! S_ISDIR(st.st_mode)) {
                        if (buf)
                                snprintf(buf, bufsz, _("mount point is not a directory"));
                } else if (src && stat(src, &st) && errno == ENOTDIR) {
index 9e7ad2b7145040df5abf19d73f08c13524aaad07..d8ba0abadb987d248fdff919ffbb0a8bd066fec8 100644 (file)
@@ -123,6 +123,7 @@ extern void mnt_free_filesystems(char **filesystems);
 
 extern char *mnt_get_kernel_cmdline_option(const char *name);
 extern int mnt_stat_mountpoint(const char *target, struct stat *st);
+extern int mnt_lstat_mountpoint(const char *target, struct stat *st);
 extern FILE *mnt_get_procfs_memstream(int fd, char **membuf);
 
 /* tab.c */
index ffbd0c1705dd65d4f13af8e04b83d02e629d62ba..77207e7e7ba84ae8cbc75f1a94f4fe8dbbb0b7ac 100644 (file)
@@ -133,6 +133,16 @@ int mnt_stat_mountpoint(const char *target, struct stat *st)
 #endif
 }
 
+int mnt_lstat_mountpoint(const char *target, struct stat *st)
+{
+#ifdef AT_NO_AUTOMOUNT
+       return fstatat(AT_FDCWD, target, st, AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW);
+#else
+       return lstat(target, st);
+#endif
+}
+
+
 /*
  * Note that the @target has to be an absolute path (so at least "/").  The
  * @filename returns an allocated buffer with the last path component, for example: