diff options
Diffstat (limited to 'net/ax25/ax25_uid.c')
| -rw-r--r-- | net/ax25/ax25_uid.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/net/ax25/ax25_uid.c b/net/ax25/ax25_uid.c index e3c579ba632..957999e43ff 100644 --- a/net/ax25/ax25_uid.c +++ b/net/ax25/ax25_uid.c @@ -51,14 +51,14 @@ int ax25_uid_policy;  EXPORT_SYMBOL(ax25_uid_policy); -ax25_uid_assoc *ax25_findbyuid(uid_t uid) +ax25_uid_assoc *ax25_findbyuid(kuid_t uid)  {  	ax25_uid_assoc *ax25_uid, *res = NULL;  	struct hlist_node *node;  	read_lock(&ax25_uid_lock);  	ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) { -		if (ax25_uid->uid == uid) { +		if (uid_eq(ax25_uid->uid, uid)) {  			ax25_uid_hold(ax25_uid);  			res = ax25_uid;  			break; @@ -84,7 +84,7 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)  		read_lock(&ax25_uid_lock);  		ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {  			if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) { -				res = ax25_uid->uid; +				res = from_kuid_munged(current_user_ns(), ax25_uid->uid);  				break;  			}  		} @@ -93,9 +93,14 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)  		return res;  	case SIOCAX25ADDUID: +	{ +		kuid_t sax25_kuid;  		if (!capable(CAP_NET_ADMIN))  			return -EPERM; -		user = ax25_findbyuid(sax->sax25_uid); +		sax25_kuid = make_kuid(current_user_ns(), sax->sax25_uid); +		if (!uid_valid(sax25_kuid)) +			return -EINVAL; +		user = ax25_findbyuid(sax25_kuid);  		if (user) {  			ax25_uid_put(user);  			return -EEXIST; @@ -106,7 +111,7 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)  			return -ENOMEM;  		atomic_set(&ax25_uid->refcount, 1); -		ax25_uid->uid  = sax->sax25_uid; +		ax25_uid->uid  = sax25_kuid;  		ax25_uid->call = sax->sax25_call;  		write_lock(&ax25_uid_lock); @@ -114,7 +119,7 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)  		write_unlock(&ax25_uid_lock);  		return 0; - +	}  	case SIOCAX25DELUID:  		if (!capable(CAP_NET_ADMIN))  			return -EPERM; @@ -172,7 +177,9 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)  		struct ax25_uid_assoc *pt;  		pt = hlist_entry(v, struct ax25_uid_assoc, uid_node); -		seq_printf(seq, "%6d %s\n", pt->uid, ax2asc(buf, &pt->call)); +		seq_printf(seq, "%6d %s\n", +			from_kuid_munged(seq_user_ns(seq), pt->uid), +			ax2asc(buf, &pt->call));  	}  	return 0;  }  |