diff options
Diffstat (limited to 'drivers/net/wireguard/netlink.c')
| -rw-r--r-- | drivers/net/wireguard/netlink.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/wireguard/netlink.c b/drivers/net/wireguard/netlink.c index 802099c8828a..20a4f3c0a0a1 100644 --- a/drivers/net/wireguard/netlink.c +++ b/drivers/net/wireguard/netlink.c @@ -511,11 +511,15 @@ static int wg_set_device(struct sk_buff *skb, struct genl_info *info)  	if (flags & ~__WGDEVICE_F_ALL)  		goto out; -	ret = -EPERM; -	if ((info->attrs[WGDEVICE_A_LISTEN_PORT] || -	     info->attrs[WGDEVICE_A_FWMARK]) && -	    !ns_capable(wg->creating_net->user_ns, CAP_NET_ADMIN)) -		goto out; +	if (info->attrs[WGDEVICE_A_LISTEN_PORT] || info->attrs[WGDEVICE_A_FWMARK]) { +		struct net *net; +		rcu_read_lock(); +		net = rcu_dereference(wg->creating_net); +		ret = !net || !ns_capable(net->user_ns, CAP_NET_ADMIN) ? -EPERM : 0; +		rcu_read_unlock(); +		if (ret) +			goto out; +	}  	++wg->device_update_gen;  | 
