]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cifs: Check if server supports reparse points before using them
authorPali Rohár <pali@kernel.org>
Sat, 19 Oct 2024 11:34:18 +0000 (13:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:12:26 +0000 (11:12 +0200)
[ Upstream commit 6c06be908ca190e2d8feae1cf452d78598cd0b94 ]

Do not attempt to query or create reparse point when server fs does not
support it. This will prevent creating unusable empty object on the server.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/smb/client/cifssmb.c
fs/smb/client/link.c
fs/smb/client/smb2inode.c
fs/smb/client/smb2ops.c

index e90811f321944f832e45cb035ef9832f123160d9..53e3e8282cb2af132b24d32b510e8f840ee80f53 100644 (file)
@@ -2725,6 +2725,9 @@ int cifs_query_reparse_point(const unsigned int xid,
        if (cap_unix(tcon->ses))
                return -EOPNOTSUPP;
 
+       if (!(le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS))
+               return -EOPNOTSUPP;
+
        oparms = (struct cifs_open_parms) {
                .tcon = tcon,
                .cifs_sb = cifs_sb,
index 34a026243287f97a14e4d95e42a96e8495857c2c..769752ad2c5ce8d38f8cc735a88719c34881379d 100644 (file)
@@ -643,7 +643,8 @@ cifs_symlink(struct mnt_idmap *idmap, struct inode *inode,
        case CIFS_SYMLINK_TYPE_NATIVE:
        case CIFS_SYMLINK_TYPE_NFS:
        case CIFS_SYMLINK_TYPE_WSL:
-               if (server->ops->create_reparse_symlink) {
+               if (server->ops->create_reparse_symlink &&
+                   (le32_to_cpu(pTcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS)) {
                        rc = server->ops->create_reparse_symlink(xid, inode,
                                                                 direntry,
                                                                 pTcon,
index 826b57a5a2a8d2afb8e5d9b8351248ee855937a1..e9fd3e204a6f4081e9d3b99a1de19e21b2fd3f6c 100644 (file)
@@ -1273,6 +1273,14 @@ struct inode *smb2_get_reparse_inode(struct cifs_open_info_data *data,
        int rc;
        int i;
 
+       /*
+        * If server filesystem does not support reparse points then do not
+        * attempt to create reparse point. This will prevent creating unusable
+        * empty object on the server.
+        */
+       if (!(le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS))
+               return ERR_PTR(-EOPNOTSUPP);
+
        oparms = CIFS_OPARMS(cifs_sb, tcon, full_path,
                             SYNCHRONIZE | DELETE |
                             FILE_READ_ATTRIBUTES |
index 6795970d4de6e4b55605c99d0b2bac6ecf4ed1a2..fbb3686292134a356d2eadcdc6bd265a46221384 100644 (file)
@@ -5237,7 +5237,7 @@ static int smb2_make_node(unsigned int xid, struct inode *inode,
                          const char *full_path, umode_t mode, dev_t dev)
 {
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
-       int rc;
+       int rc = -EOPNOTSUPP;
 
        /*
         * Check if mounted with mount parm 'sfu' mount parm.
@@ -5248,7 +5248,7 @@ static int smb2_make_node(unsigned int xid, struct inode *inode,
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
                rc = cifs_sfu_make_node(xid, inode, dentry, tcon,
                                        full_path, mode, dev);
-       } else {
+       } else if (le32_to_cpu(tcon->fsAttrInfo.Attributes) & FILE_SUPPORTS_REPARSE_POINTS) {
                rc = smb2_mknod_reparse(xid, inode, dentry, tcon,
                                        full_path, mode, dev);
        }