aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/netlink.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-11-17 11:33:24 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2017-11-17 11:33:24 +0100
commit82e6e3b2588939b03d0a534b85f446183a13ceda (patch)
tree3dab6c0d4d9e000d214251714ff8238a10c2b4a1 /src/netlink.c
parentcompat: fix compilation with PaX (diff)
downloadwireguard-monolithic-historical-82e6e3b2588939b03d0a534b85f446183a13ceda.tar.xz
wireguard-monolithic-historical-82e6e3b2588939b03d0a534b85f446183a13ceda.zip
socket: only free socket after successful creation of new
When an interface is down, the socket port can change freely. A socket will be allocated when the interface comes up, and if a socket can't be allocated, the interface doesn't come up. However, a socket port can change while the interface is up. In this case, if a new socket with a new port cannot be allocated, it's important to keep the interface in a consistent state. The choices are either to bring down the interface or to preserve the old socket. This patch implements the latter. Reported-by: Marc-Antoine Perennou <keruspe@exherbo.org>
Diffstat (limited to 'src/netlink.c')
-rw-r--r--src/netlink.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/netlink.c b/src/netlink.c
index f2e724a..9297e60 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -260,13 +260,13 @@ static int set_port(struct wireguard_device *wg, u16 port)
if (wg->incoming_port == port)
return 0;
- socket_uninit(wg);
- wg->incoming_port = port;
list_for_each_entry(peer, &wg->peer_list, peer_list)
socket_clear_peer_endpoint_src(peer);
- if (!netif_running(wg->dev))
+ if (!netif_running(wg->dev)) {
+ wg->incoming_port = port;
return 0;
- return socket_init(wg);
+ }
+ return socket_init(wg, port);
}
static int set_allowedip(struct wireguard_peer *peer, struct nlattr **attrs)