diff options
-rw-r--r-- | fs/fuse/dev.c | 4 | ||||
-rw-r--r-- | fs/fuse/dir.c | 20 | ||||
-rw-r--r-- | fs/fuse/fuse_i.h | 4 | ||||
-rw-r--r-- | fs/fuse/inode.c | 23 | ||||
-rw-r--r-- | init/Kconfig | 1 |
5 files changed, 28 insertions, 24 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 8c23fa7a91e6..c16335315e5d 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
@@ -92,8 +92,8 @@ static void __fuse_put_request(struct fuse_req *req) | |||
92 | 92 | ||
93 | static void fuse_req_init_context(struct fuse_req *req) | 93 | static void fuse_req_init_context(struct fuse_req *req) |
94 | { | 94 | { |
95 | req->in.h.uid = current_fsuid(); | 95 | req->in.h.uid = from_kuid_munged(&init_user_ns, current_fsuid()); |
96 | req->in.h.gid = current_fsgid(); | 96 | req->in.h.gid = from_kgid_munged(&init_user_ns, current_fsgid()); |
97 | req->in.h.pid = current->pid; | 97 | req->in.h.pid = current->pid; |
98 | } | 98 | } |
99 | 99 | ||
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 324bc0850534..b7c09f9eb40c 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
@@ -818,8 +818,8 @@ static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr, | |||
818 | stat->ino = attr->ino; | 818 | stat->ino = attr->ino; |
819 | stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777); | 819 | stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777); |
820 | stat->nlink = attr->nlink; | 820 | stat->nlink = attr->nlink; |
821 | stat->uid = attr->uid; | 821 | stat->uid = make_kuid(&init_user_ns, attr->uid); |
822 | stat->gid = attr->gid; | 822 | stat->gid = make_kgid(&init_user_ns, attr->gid); |
823 | stat->rdev = inode->i_rdev; | 823 | stat->rdev = inode->i_rdev; |
824 | stat->atime.tv_sec = attr->atime; | 824 | stat->atime.tv_sec = attr->atime; |
825 | stat->atime.tv_nsec = attr->atimensec; | 825 | stat->atime.tv_nsec = attr->atimensec; |
@@ -1007,12 +1007,12 @@ int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task) | |||
1007 | rcu_read_lock(); | 1007 | rcu_read_lock(); |
1008 | ret = 0; | 1008 | ret = 0; |
1009 | cred = __task_cred(task); | 1009 | cred = __task_cred(task); |
1010 | if (cred->euid == fc->user_id && | 1010 | if (uid_eq(cred->euid, fc->user_id) && |
1011 | cred->suid == fc->user_id && | 1011 | uid_eq(cred->suid, fc->user_id) && |
1012 | cred->uid == fc->user_id && | 1012 | uid_eq(cred->uid, fc->user_id) && |
1013 | cred->egid == fc->group_id && | 1013 | gid_eq(cred->egid, fc->group_id) && |
1014 | cred->sgid == fc->group_id && | 1014 | gid_eq(cred->sgid, fc->group_id) && |
1015 | cred->gid == fc->group_id) | 1015 | gid_eq(cred->gid, fc->group_id)) |
1016 | ret = 1; | 1016 | ret = 1; |
1017 | rcu_read_unlock(); | 1017 | rcu_read_unlock(); |
1018 | 1018 | ||
@@ -1306,9 +1306,9 @@ static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg) | |||
1306 | if (ivalid & ATTR_MODE) | 1306 | if (ivalid & ATTR_MODE) |
1307 | arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode; | 1307 | arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode; |
1308 | if (ivalid & ATTR_UID) | 1308 | if (ivalid & ATTR_UID) |
1309 | arg->valid |= FATTR_UID, arg->uid = iattr->ia_uid; | 1309 | arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid); |
1310 | if (ivalid & ATTR_GID) | 1310 | if (ivalid & ATTR_GID) |
1311 | arg->valid |= FATTR_GID, arg->gid = iattr->ia_gid; | 1311 | arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid); |
1312 | if (ivalid & ATTR_SIZE) | 1312 | if (ivalid & ATTR_SIZE) |
1313 | arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size; | 1313 | arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size; |
1314 | if (ivalid & ATTR_ATIME) { | 1314 | if (ivalid & ATTR_ATIME) { |
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index e24dd74e3068..e105a53fc72d 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -333,10 +333,10 @@ struct fuse_conn { | |||
333 | atomic_t count; | 333 | atomic_t count; |
334 | 334 | ||
335 | /** The user id for this mount */ | 335 | /** The user id for this mount */ |
336 | uid_t user_id; | 336 | kuid_t user_id; |
337 | 337 | ||
338 | /** The group id for this mount */ | 338 | /** The group id for this mount */ |
339 | gid_t group_id; | 339 | kgid_t group_id; |
340 | 340 | ||
341 | /** The fuse mount flags for this mount */ | 341 | /** The fuse mount flags for this mount */ |
342 | unsigned flags; | 342 | unsigned flags; |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index f0eda124cffb..73ca6b72beaf 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -60,8 +60,8 @@ MODULE_PARM_DESC(max_user_congthresh, | |||
60 | struct fuse_mount_data { | 60 | struct fuse_mount_data { |
61 | int fd; | 61 | int fd; |
62 | unsigned rootmode; | 62 | unsigned rootmode; |
63 | unsigned user_id; | 63 | kuid_t user_id; |
64 | unsigned group_id; | 64 | kgid_t group_id; |
65 | unsigned fd_present:1; | 65 | unsigned fd_present:1; |
66 | unsigned rootmode_present:1; | 66 | unsigned rootmode_present:1; |
67 | unsigned user_id_present:1; | 67 | unsigned user_id_present:1; |
@@ -164,8 +164,8 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr, | |||
164 | inode->i_ino = fuse_squash_ino(attr->ino); | 164 | inode->i_ino = fuse_squash_ino(attr->ino); |
165 | inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777); | 165 | inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777); |
166 | set_nlink(inode, attr->nlink); | 166 | set_nlink(inode, attr->nlink); |
167 | inode->i_uid = attr->uid; | 167 | inode->i_uid = make_kuid(&init_user_ns, attr->uid); |
168 | inode->i_gid = attr->gid; | 168 | inode->i_gid = make_kgid(&init_user_ns, attr->gid); |
169 | inode->i_blocks = attr->blocks; | 169 | inode->i_blocks = attr->blocks; |
170 | inode->i_atime.tv_sec = attr->atime; | 170 | inode->i_atime.tv_sec = attr->atime; |
171 | inode->i_atime.tv_nsec = attr->atimensec; | 171 | inode->i_atime.tv_nsec = attr->atimensec; |
@@ -492,14 +492,18 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev) | |||
492 | case OPT_USER_ID: | 492 | case OPT_USER_ID: |
493 | if (match_int(&args[0], &value)) | 493 | if (match_int(&args[0], &value)) |
494 | return 0; | 494 | return 0; |
495 | d->user_id = value; | 495 | d->user_id = make_kuid(current_user_ns(), value); |
496 | if (!uid_valid(d->user_id)) | ||
497 | return 0; | ||
496 | d->user_id_present = 1; | 498 | d->user_id_present = 1; |
497 | break; | 499 | break; |
498 | 500 | ||
499 | case OPT_GROUP_ID: | 501 | case OPT_GROUP_ID: |
500 | if (match_int(&args[0], &value)) | 502 | if (match_int(&args[0], &value)) |
501 | return 0; | 503 | return 0; |
502 | d->group_id = value; | 504 | d->group_id = make_kgid(current_user_ns(), value); |
505 | if (!gid_valid(d->group_id)) | ||
506 | return 0; | ||
503 | d->group_id_present = 1; | 507 | d->group_id_present = 1; |
504 | break; | 508 | break; |
505 | 509 | ||
@@ -540,8 +544,8 @@ static int fuse_show_options(struct seq_file *m, struct dentry *root) | |||
540 | struct super_block *sb = root->d_sb; | 544 | struct super_block *sb = root->d_sb; |
541 | struct fuse_conn *fc = get_fuse_conn_super(sb); | 545 | struct fuse_conn *fc = get_fuse_conn_super(sb); |
542 | 546 | ||
543 | seq_printf(m, ",user_id=%u", fc->user_id); | 547 | seq_printf(m, ",user_id=%u", from_kuid_munged(&init_user_ns, fc->user_id)); |
544 | seq_printf(m, ",group_id=%u", fc->group_id); | 548 | seq_printf(m, ",group_id=%u", from_kgid_munged(&init_user_ns, fc->group_id)); |
545 | if (fc->flags & FUSE_DEFAULT_PERMISSIONS) | 549 | if (fc->flags & FUSE_DEFAULT_PERMISSIONS) |
546 | seq_puts(m, ",default_permissions"); | 550 | seq_puts(m, ",default_permissions"); |
547 | if (fc->flags & FUSE_ALLOW_OTHER) | 551 | if (fc->flags & FUSE_ALLOW_OTHER) |
@@ -989,7 +993,8 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) | |||
989 | if (!file) | 993 | if (!file) |
990 | goto err; | 994 | goto err; |
991 | 995 | ||
992 | if (file->f_op != &fuse_dev_operations) | 996 | if ((file->f_op != &fuse_dev_operations) || |
997 | (file->f_cred->user_ns != &init_user_ns)) | ||
993 | goto err_fput; | 998 | goto err_fput; |
994 | 999 | ||
995 | fc = kmalloc(sizeof(*fc), GFP_KERNEL); | 1000 | fc = kmalloc(sizeof(*fc), GFP_KERNEL); |
diff --git a/init/Kconfig b/init/Kconfig index b6369fbaa22b..38c1a1d0bf38 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -1007,7 +1007,6 @@ config UIDGID_CONVERTED | |||
1007 | depends on CEPH_FS = n | 1007 | depends on CEPH_FS = n |
1008 | depends on CIFS = n | 1008 | depends on CIFS = n |
1009 | depends on CODA_FS = n | 1009 | depends on CODA_FS = n |
1010 | depends on FUSE_FS = n | ||
1011 | depends on GFS2_FS = n | 1010 | depends on GFS2_FS = n |
1012 | depends on NCP_FS = n | 1011 | depends on NCP_FS = n |
1013 | depends on NFSD = n | 1012 | depends on NFSD = n |