Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm...
[cascardo/linux.git] / fs / cifs / connect.c
index 12b3da3..4474a57 100644 (file)
@@ -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))