]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cifs: set the CREATE_NOT_FILE when opening the directory in use_cached_dir()
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 9 May 2022 23:42:06 +0000 (09:42 +1000)
committerSteve French <stfrench@microsoft.com>
Sat, 21 May 2022 17:23:24 +0000 (12:23 -0500)
This enforces that we can only do this for directories and not normal files
or else the server will return an error.
This means that we will have conditionally check IF the path refers
to a directory or not in all the call-sites where we are unsure.
Right now this check is for "" i.e. root.

Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Reviewed-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/smb2inode.c
fs/cifs/smb2ops.c

index 1b89b9b8a212a35808a2ad31d282d50c95a1be47..8571a459c7101ef6fd89b55f29e905767925a5e8 100644 (file)
@@ -512,8 +512,11 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
        if (smb2_data == NULL)
                return -ENOMEM;
 
+       if (strcmp(full_path, ""))
+               rc = -ENOENT;
+       else
+               rc = open_cached_dir(xid, tcon, full_path, cifs_sb, &cfid);
        /* If it is a root and its handle is cached then use it */
-       rc = open_cached_dir(xid, tcon, full_path, cifs_sb, &cfid);
        if (!rc) {
                if (tcon->crfid.file_all_info_is_valid) {
                        move_smb2_info_to_cifs(data,
index 2c93ee27d54d51ae4684f5bd9c2c9b51aada8573..cbe56ed35694da44f2f0a8b3901263860d505bb9 100644 (file)
@@ -825,7 +825,7 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,
        rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
 
        oparms.tcon = tcon;
-       oparms.create_options = cifs_create_options(cifs_sb, 0);
+       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_FILE);
        oparms.desired_access = FILE_READ_ATTRIBUTES;
        oparms.disposition = FILE_OPEN;
        oparms.fid = pfid;
@@ -2696,7 +2696,8 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
        resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
        memset(rsp_iov, 0, sizeof(rsp_iov));
 
-       rc = open_cached_dir(xid, tcon, path, cifs_sb, &cfid);
+       if (!strcmp(path, ""))
+               rc = open_cached_dir(xid, tcon, path, cifs_sb, &cfid);
 
        memset(&open_iov, 0, sizeof(open_iov));
        rqst[0].rq_iov = open_iov;