diff options
Diffstat (limited to 'kernel/user_namespace.c')
| -rw-r--r-- | kernel/user_namespace.c | 54 | 
1 files changed, 33 insertions, 21 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 13fb1134ba5..fcc02560fd6 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c @@ -101,6 +101,9 @@ int create_user_ns(struct cred *new)  	set_cred_user_ns(new, ns); +#ifdef CONFIG_PERSISTENT_KEYRINGS +	init_rwsem(&ns->persistent_keyring_register_sem); +#endif  	return 0;  } @@ -130,6 +133,9 @@ void free_user_ns(struct user_namespace *ns)  	do {  		parent = ns->parent; +#ifdef CONFIG_PERSISTENT_KEYRINGS +		key_put(ns->persistent_keyring_register); +#endif  		proc_free_inum(ns->proc_inum);  		kmem_cache_free(user_ns_cachep, ns);  		ns = parent; @@ -146,7 +152,7 @@ static u32 map_id_range_down(struct uid_gid_map *map, u32 id, u32 count)  	/* Find the matching extent */  	extents = map->nr_extents; -	smp_read_barrier_depends(); +	smp_rmb();  	for (idx = 0; idx < extents; idx++) {  		first = map->extent[idx].first;  		last = first + map->extent[idx].count - 1; @@ -170,7 +176,7 @@ static u32 map_id_down(struct uid_gid_map *map, u32 id)  	/* Find the matching extent */  	extents = map->nr_extents; -	smp_read_barrier_depends(); +	smp_rmb();  	for (idx = 0; idx < extents; idx++) {  		first = map->extent[idx].first;  		last = first + map->extent[idx].count - 1; @@ -193,7 +199,7 @@ static u32 map_id_up(struct uid_gid_map *map, u32 id)  	/* Find the matching extent */  	extents = map->nr_extents; -	smp_read_barrier_depends(); +	smp_rmb();  	for (idx = 0; idx < extents; idx++) {  		first = map->extent[idx].lower_first;  		last = first + map->extent[idx].count - 1; @@ -219,7 +225,7 @@ static u32 map_id_up(struct uid_gid_map *map, u32 id)   *   *	When there is no mapping defined for the user-namespace uid   *	pair INVALID_UID is returned.  Callers are expected to test - *	for and handle handle INVALID_UID being returned.  INVALID_UID + *	for and handle INVALID_UID being returned.  INVALID_UID   *	may be tested for using uid_valid().   */  kuid_t make_kuid(struct user_namespace *ns, uid_t uid) @@ -280,7 +286,7 @@ EXPORT_SYMBOL(from_kuid_munged);  /**   *	make_kgid - Map a user-namespace gid pair into a kgid.   *	@ns:  User namespace that the gid is in - *	@uid: group identifier + *	@gid: group identifier   *   *	Maps a user-namespace gid pair into a kernel internal kgid,   *	and returns that kgid. @@ -476,7 +482,8 @@ static int projid_m_show(struct seq_file *seq, void *v)  	return 0;  } -static void *m_start(struct seq_file *seq, loff_t *ppos, struct uid_gid_map *map) +static void *m_start(struct seq_file *seq, loff_t *ppos, +		     struct uid_gid_map *map)  {  	struct uid_gid_extent *extent = NULL;  	loff_t pos = *ppos; @@ -540,7 +547,8 @@ struct seq_operations proc_projid_seq_operations = {  	.show = projid_m_show,  }; -static bool mappings_overlap(struct uid_gid_map *new_map, struct uid_gid_extent *extent) +static bool mappings_overlap(struct uid_gid_map *new_map, +			     struct uid_gid_extent *extent)  {  	u32 upper_first, lower_first, upper_last, lower_last;  	unsigned idx; @@ -609,9 +617,8 @@ static ssize_t map_write(struct file *file, const char __user *buf,  	 * were written before the count of the extents.  	 *  	 * To achieve this smp_wmb() is used on guarantee the write -	 * order and smp_read_barrier_depends() is guaranteed that we -	 * don't have crazy architectures returning stale data. -	 * +	 * order and smp_rmb() is guaranteed that we don't have crazy +	 * architectures returning stale data.  	 */  	mutex_lock(&id_map_mutex); @@ -648,7 +655,7 @@ static ssize_t map_write(struct file *file, const char __user *buf,  	ret = -EINVAL;  	pos = kbuf;  	new_map.nr_extents = 0; -	for (;pos; pos = next_line) { +	for (; pos; pos = next_line) {  		extent = &new_map.extent[new_map.nr_extents];  		/* Find the end of line and ensure I don't look past it */ @@ -682,13 +689,16 @@ static ssize_t map_write(struct file *file, const char __user *buf,  		/* Verify we have been given valid starting values */  		if ((extent->first == (u32) -1) || -		    (extent->lower_first == (u32) -1 )) +		    (extent->lower_first == (u32) -1))  			goto out; -		/* Verify count is not zero and does not cause the extent to wrap */ +		/* Verify count is not zero and does not cause the +		 * extent to wrap +		 */  		if ((extent->first + extent->count) <= extent->first)  			goto out; -		if ((extent->lower_first + extent->count) <= extent->lower_first) +		if ((extent->lower_first + extent->count) <= +		     extent->lower_first)  			goto out;  		/* Do the ranges in extent overlap any previous extents? */ @@ -746,7 +756,8 @@ out:  	return ret;  } -ssize_t proc_uid_map_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +ssize_t proc_uid_map_write(struct file *file, const char __user *buf, +			   size_t size, loff_t *ppos)  {  	struct seq_file *seq = file->private_data;  	struct user_namespace *ns = seq->private; @@ -762,7 +773,8 @@ ssize_t proc_uid_map_write(struct file *file, const char __user *buf, size_t siz  			 &ns->uid_map, &ns->parent->uid_map);  } -ssize_t proc_gid_map_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +ssize_t proc_gid_map_write(struct file *file, const char __user *buf, +			   size_t size, loff_t *ppos)  {  	struct seq_file *seq = file->private_data;  	struct user_namespace *ns = seq->private; @@ -778,7 +790,8 @@ ssize_t proc_gid_map_write(struct file *file, const char __user *buf, size_t siz  			 &ns->gid_map, &ns->parent->gid_map);  } -ssize_t proc_projid_map_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) +ssize_t proc_projid_map_write(struct file *file, const char __user *buf, +			      size_t size, loff_t *ppos)  {  	struct seq_file *seq = file->private_data;  	struct user_namespace *ns = seq->private; @@ -795,7 +808,7 @@ ssize_t proc_projid_map_write(struct file *file, const char __user *buf, size_t  			 &ns->projid_map, &ns->parent->projid_map);  } -static bool new_idmap_permitted(const struct file *file,  +static bool new_idmap_permitted(const struct file *file,  				struct user_namespace *ns, int cap_setid,  				struct uid_gid_map *new_map)  { @@ -806,8 +819,7 @@ static bool new_idmap_permitted(const struct file *file,  			kuid_t uid = make_kuid(ns->parent, id);  			if (uid_eq(uid, file->f_cred->fsuid))  				return true; -		} -		else if (cap_setid == CAP_SETGID) { +		} else if (cap_setid == CAP_SETGID) {  			kgid_t gid = make_kgid(ns->parent, id);  			if (gid_eq(gid, file->f_cred->fsgid))  				return true; @@ -896,4 +908,4 @@ static __init int user_namespaces_init(void)  	user_ns_cachep = KMEM_CACHE(user_namespace, SLAB_PANIC);  	return 0;  } -module_init(user_namespaces_init); +subsys_initcall(user_namespaces_init);  | 
