Skip to content

Commit 4ab5260

Browse files
author
Al Viro
committed
do_cifs_create(): don't set ->i_mode of something we had not created
If the file had existed before we'd called ->atomic_open() (without O_EXCL, that is), we have no more business setting ->i_mode than we would setting ->i_uid or ->i_gid. We also have no business doing either if another client has managed to get unlink+mkdir between ->open() and cifs_inode_get_info(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 4a378d8 commit 4ab5260

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

fs/cifs/dir.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -418,15 +418,16 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
418418
if (newinode) {
419419
if (server->ops->set_lease_key)
420420
server->ops->set_lease_key(newinode, fid);
421-
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
422-
newinode->i_mode = mode;
423-
if ((*oplock & CIFS_CREATE_ACTION) &&
424-
(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)) {
425-
newinode->i_uid = current_fsuid();
426-
if (inode->i_mode & S_ISGID)
427-
newinode->i_gid = inode->i_gid;
428-
else
429-
newinode->i_gid = current_fsgid();
421+
if ((*oplock & CIFS_CREATE_ACTION) && S_ISREG(newinode->i_mode)) {
422+
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
423+
newinode->i_mode = mode;
424+
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
425+
newinode->i_uid = current_fsuid();
426+
if (inode->i_mode & S_ISGID)
427+
newinode->i_gid = inode->i_gid;
428+
else
429+
newinode->i_gid = current_fsgid();
430+
}
430431
}
431432
}
432433
}

0 commit comments

Comments
 (0)