aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/inode.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2005-11-29 23:20:10 -0500
committerSteve French <sfrench@us.ibm.com>2005-11-29 23:20:10 -0500
commit6473a559c336d5c407f9df412ca2f55357767ff8 (patch)
treeededf2b339de4541e98c78b5d537ab954d9dc413 /fs/cifs/inode.c
parent3abb92722ab1784b419dadb5444daf8ea9636905 (diff)
[CIFS] Fix missing permission check on setattr when noperm mount option is
disabled. Also set mode, uid, gid better on mkdir and create for the case when Unix Extensions is not enabled and setuids is enabled. This is necessary to fix the hole in which chown could be allowed for non-root users in some cases if root mounted, and also to display the mode and uid properly in some cases. Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r--fs/cifs/inode.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index d34325c887c4..053c1cadf703 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -710,7 +710,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
710 char *full_path = NULL; 710 char *full_path = NULL;
711 struct inode *newinode = NULL; 711 struct inode *newinode = NULL;
712 712
713 cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p ", mode, inode)); 713 cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode));
714 714
715 xid = GetXid(); 715 xid = GetXid();
716 716
@@ -768,7 +768,16 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
768 /* BB to be implemented via Windows secrty descriptors 768 /* BB to be implemented via Windows secrty descriptors
769 eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode, 769 eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode,
770 -1, -1, local_nls); */ 770 -1, -1, local_nls); */
771 } 771 if(direntry->d_inode) {
772 direntry->d_inode->i_mode = mode;
773 if(cifs_sb->mnt_cifs_flags &
774 CIFS_MOUNT_SET_UID) {
775 direntry->d_inode->i_uid =
776 current->fsuid;
777 direntry->d_inode->i_gid =
778 current->fsgid;
779 }
780 }
772 } 781 }
773 kfree(full_path); 782 kfree(full_path);
774 FreeXid(xid); 783 FreeXid(xid);
@@ -1111,9 +1120,20 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
1111 1120
1112 cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ", 1121 cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ",
1113 direntry->d_name.name, attrs->ia_valid)); 1122 direntry->d_name.name, attrs->ia_valid));
1123
1114 cifs_sb = CIFS_SB(direntry->d_inode->i_sb); 1124 cifs_sb = CIFS_SB(direntry->d_inode->i_sb);
1115 pTcon = cifs_sb->tcon; 1125 pTcon = cifs_sb->tcon;
1116 1126
1127 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM == 0) {
1128 /* check if we have permission to change attrs */
1129 rc = inode_change_ok(direntry->d_inode, attrs);
1130 if(rc < 0) {
1131 FreeXid(xid);
1132 return rc;
1133 } else
1134 rc = 0;
1135 }
1136
1117 down(&direntry->d_sb->s_vfs_rename_sem); 1137 down(&direntry->d_sb->s_vfs_rename_sem);
1118 full_path = build_path_from_dentry(direntry); 1138 full_path = build_path_from_dentry(direntry);
1119 up(&direntry->d_sb->s_vfs_rename_sem); 1139 up(&direntry->d_sb->s_vfs_rename_sem);
@@ -1153,7 +1173,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
1153 1 /* 45 seconds */); 1173 1 /* 45 seconds */);
1154 cFYI(1,("Wrt seteof rc %d", rc)); 1174 cFYI(1,("Wrt seteof rc %d", rc));
1155 } 1175 }
1156 } 1176 } else
1177 rc = -EINVAL;
1178
1157 if (rc != 0) { 1179 if (rc != 0) {
1158 /* Set file size by pathname rather than by handle 1180 /* Set file size by pathname rather than by handle
1159 either because no valid, writeable file handle for 1181 either because no valid, writeable file handle for