Skip to content

Commit 2f3017e

Browse files
committed
smb3: fix incorrect mode displayed for read-only files
Commands like "chmod 0444" mark a file readonly via the attribute flag (when mapping of mode bits into the ACL are not set, or POSIX extensions are not negotiated), but they were not reported correctly for stat of directories (they were reported ok for files and for "ls"). See example below: root:~# ls /mnt2 -l total 12 drwxr-xr-x 2 root root 0 Sep 21 18:03 normaldir -rwxr-xr-x 1 root root 0 Sep 21 23:24 normalfile dr-xr-xr-x 2 root root 0 Sep 21 17:55 readonly-dir -r-xr-xr-x 1 root root 209716224 Sep 21 18:15 readonly-file root:~# stat -c %a /mnt2/readonly-dir 755 root:~# stat -c %a /mnt2/readonly-file 555 This fixes the stat of directories when ATTR_READONLY is set (in cases where the mode can not be obtained other ways). root:~# stat -c %a /mnt2/readonly-dir 555 Cc: [email protected] Signed-off-by: Steve French <[email protected]>
1 parent 663f295 commit 2f3017e

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

fs/smb/client/inode.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -834,10 +834,6 @@ static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
834834
fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
835835
fattr->cf_dtype = DT_REG;
836836

837-
/* clear write bits if ATTR_READONLY is set */
838-
if (fattr->cf_cifsattrs & ATTR_READONLY)
839-
fattr->cf_mode &= ~(S_IWUGO);
840-
841837
/*
842838
* Don't accept zero nlink from non-unix servers unless
843839
* delete is pending. Instead mark it as unknown.
@@ -850,6 +846,10 @@ static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
850846
}
851847
}
852848

849+
/* clear write bits if ATTR_READONLY is set */
850+
if (fattr->cf_cifsattrs & ATTR_READONLY)
851+
fattr->cf_mode &= ~(S_IWUGO);
852+
853853
out_reparse:
854854
if (S_ISLNK(fattr->cf_mode)) {
855855
if (likely(data->symlink_target))
@@ -1267,11 +1267,14 @@ static int cifs_get_fattr(struct cifs_open_info_data *data,
12671267
__func__, rc);
12681268
goto out;
12691269
}
1270-
}
1271-
1272-
/* fill in remaining high mode bits e.g. SUID, VTX */
1273-
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1270+
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1271+
/* fill in remaining high mode bits e.g. SUID, VTX */
12741272
cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1273+
else if (!(tcon->posix_extensions))
1274+
/* clear write bits if ATTR_READONLY is set */
1275+
if (fattr->cf_cifsattrs & ATTR_READONLY)
1276+
fattr->cf_mode &= ~(S_IWUGO);
1277+
12751278

12761279
/* check for Minshall+French symlinks */
12771280
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {

0 commit comments

Comments
 (0)