aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/inode.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2013-02-06 02:55:44 -0500
committerEric W. Biederman <ebiederm@xmission.com>2013-02-13 10:28:36 -0500
commit46bbc25f9ff1242cd1c042580aec11ddb5e41369 (patch)
treedfeb9071f534aa076ed302b8ee5e8f3d988712de /fs/cifs/inode.c
parentc9617a44b39d75b2098283d56355d02d4d5bee8b (diff)
cifs: Override unmappable incoming uids and gids
The cifs protocol has a 64bit space for uids and gids, while linux only supports a 32bit space today. Instead of silently truncating 64bit cifs ids, replace cifs ids that do not fit in the 32bit linux id space with the default uid and gids for the cifs mount. Cc: Steve French <smfrench@gmail.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r--fs/cifs/inode.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index ed6208ff85a7..d7ea2a6eaead 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -244,15 +244,19 @@ cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
244 break; 244 break;
245 } 245 }
246 246
247 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID) 247 fattr->cf_uid = cifs_sb->mnt_uid;
248 fattr->cf_uid = cifs_sb->mnt_uid; 248 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
249 else 249 u64 id = le64_to_cpu(info->Uid);
250 fattr->cf_uid = le64_to_cpu(info->Uid); 250 if (id < ((uid_t)-1))
251 251 fattr->cf_uid = id;
252 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) 252 }
253 fattr->cf_gid = cifs_sb->mnt_gid; 253
254 else 254 fattr->cf_gid = cifs_sb->mnt_gid;
255 fattr->cf_gid = le64_to_cpu(info->Gid); 255 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
256 u64 id = le64_to_cpu(info->Gid);
257 if (id < ((gid_t)-1))
258 fattr->cf_gid = id;
259 }
256 260
257 fattr->cf_nlink = le64_to_cpu(info->Nlinks); 261 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
258} 262}