diff options
Diffstat (limited to 'fs/cifs/connect.c')
| -rw-r--r-- | fs/cifs/connect.c | 66 | 
1 files changed, 48 insertions, 18 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 12b3da39733..4474a57f30a 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -987,6 +987,41 @@ static int get_option_ul(substring_t args[], unsigned long *option)  	return rc;  } +static int get_option_uid(substring_t args[], kuid_t *result) +{ +	unsigned long value; +	kuid_t uid; +	int rc; + +	rc = get_option_ul(args, &value); +	if (rc) +		return rc; + +	uid = make_kuid(current_user_ns(), value); +	if (!uid_valid(uid)) +		return -EINVAL; + +	*result = uid; +	return 0; +} + +static int get_option_gid(substring_t args[], kgid_t *result) +{ +	unsigned long value; +	kgid_t gid; +	int rc; + +	rc = get_option_ul(args, &value); +	if (rc) +		return rc; + +	gid = make_kgid(current_user_ns(), value); +	if (!gid_valid(gid)) +		return -EINVAL; + +	*result = gid; +	return 0; +}  static int cifs_parse_security_flavors(char *value,  				       struct smb_vol *vol) @@ -1424,47 +1459,42 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,  		/* Numeric Values */  		case Opt_backupuid: -			if (get_option_ul(args, &option)) { +			if (get_option_uid(args, &vol->backupuid)) {  				cERROR(1, "%s: Invalid backupuid value",  					__func__);  				goto cifs_parse_mount_err;  			} -			vol->backupuid = option;  			vol->backupuid_specified = true;  			break;  		case Opt_backupgid: -			if (get_option_ul(args, &option)) { +			if (get_option_gid(args, &vol->backupgid)) {  				cERROR(1, "%s: Invalid backupgid value",  					__func__);  				goto cifs_parse_mount_err;  			} -			vol->backupgid = option;  			vol->backupgid_specified = true;  			break;  		case Opt_uid: -			if (get_option_ul(args, &option)) { +			if (get_option_uid(args, &vol->linux_uid)) {  				cERROR(1, "%s: Invalid uid value",  					__func__);  				goto cifs_parse_mount_err;  			} -			vol->linux_uid = option;  			uid_specified = true;  			break;  		case Opt_cruid: -			if (get_option_ul(args, &option)) { +			if (get_option_uid(args, &vol->cred_uid)) {  				cERROR(1, "%s: Invalid cruid value",  					__func__);  				goto cifs_parse_mount_err;  			} -			vol->cred_uid = option;  			break;  		case Opt_gid: -			if (get_option_ul(args, &option)) { +			if (get_option_gid(args, &vol->linux_gid)) {  				cERROR(1, "%s: Invalid gid value",  						__func__);  				goto cifs_parse_mount_err;  			} -			vol->linux_gid = option;  			gid_specified = true;  			break;  		case Opt_file_mode: @@ -2241,7 +2271,7 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol)  {  	switch (ses->server->secType) {  	case Kerberos: -		if (vol->cred_uid != ses->cred_uid) +		if (!uid_eq(vol->cred_uid, ses->cred_uid))  			return 0;  		break;  	default: @@ -2713,7 +2743,7 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)  	if (new->rsize && new->rsize < old->rsize)  		return 0; -	if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid) +	if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))  		return 0;  	if (old->mnt_file_mode != new->mnt_file_mode || @@ -3919,7 +3949,7 @@ cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)  }  static struct cifs_tcon * -cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) +cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)  {  	int rc;  	struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); @@ -3989,7 +4019,7 @@ cifs_sb_tcon_pending_wait(void *unused)  /* find and return a tlink with given uid */  static struct tcon_link * -tlink_rb_search(struct rb_root *root, uid_t uid) +tlink_rb_search(struct rb_root *root, kuid_t uid)  {  	struct rb_node *node = root->rb_node;  	struct tcon_link *tlink; @@ -3997,9 +4027,9 @@ tlink_rb_search(struct rb_root *root, uid_t uid)  	while (node) {  		tlink = rb_entry(node, struct tcon_link, tl_rbnode); -		if (tlink->tl_uid > uid) +		if (uid_gt(tlink->tl_uid, uid))  			node = node->rb_left; -		else if (tlink->tl_uid < uid) +		else if (uid_lt(tlink->tl_uid, uid))  			node = node->rb_right;  		else  			return tlink; @@ -4018,7 +4048,7 @@ tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)  		tlink = rb_entry(*new, struct tcon_link, tl_rbnode);  		parent = *new; -		if (tlink->tl_uid > new_tlink->tl_uid) +		if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))  			new = &((*new)->rb_left);  		else  			new = &((*new)->rb_right); @@ -4048,7 +4078,7 @@ struct tcon_link *  cifs_sb_tlink(struct cifs_sb_info *cifs_sb)  {  	int ret; -	uid_t fsuid = current_fsuid(); +	kuid_t fsuid = current_fsuid();  	struct tcon_link *tlink, *newtlink;  	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))  |