diff options
| author | David S. Miller <davem@davemloft.net> | 2020-06-24 00:50:34 +0300 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2020-06-24 00:50:34 +0300 |
| commit | 2bcd350285ecbe442d5a1a27c04bd265baf992bb (patch) | |
| tree | bc2af98abab2084854244d25f925484390b038ad /drivers/net/wireguard/netlink.c | |
| parent | f7fb92acd9e5606f6666bb0f9a7240002a6b3ff0 (diff) | |
| parent | 900575aa33a3eaaef802b31de187a85c4a4b4bd0 (diff) | |
| download | linux-2bcd350285ecbe442d5a1a27c04bd265baf992bb.tar.xz | |
Merge branch 'wg-fixes'
Jason A. Donenfeld says:
====================
wireguard fixes for 5.8-rc3
This series contains two fixes, one cosmetic and one quite important:
1) Avoid the `if ((x = f()) == y)` pattern, from Frank
Werner-Krippendorf.
2) Mitigate a potential memory leak by creating circular netns
references, while also making the netns semantics a bit more
robust.
Patch (2) has a "Fixes:" line and should be backported to stable.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
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; |
