aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/socket.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-03-22 22:25:23 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2017-03-24 04:44:27 +0100
commit01eda9e92a6e097c9b25d7698b0d2f4cc3346647 (patch)
tree989140828bb8d64f83947ec714830769a977c6f2 /src/socket.c
parenttools: document # comments in wg(8) man page (diff)
downloadwireguard-monolithic-historical-01eda9e92a6e097c9b25d7698b0d2f4cc3346647.tar.xz
wireguard-monolithic-historical-01eda9e92a6e097c9b25d7698b0d2f4cc3346647.zip
socket: avoid deadlock on port retry
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/socket.c b/src/socket.c
index f894cfe..a2b64b3 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -322,11 +322,11 @@ int socket_init(struct wireguard_device *wg)
.use_udp6_rx_checksums = true,
.ipv6_v6only = true
};
-retry:
#endif
-
mutex_lock(&wg->socket_update_lock);
-
+#if IS_ENABLED(CONFIG_IPV6)
+retry:
+#endif
if (rcu_dereference_protected(wg->sock4, lockdep_is_held(&wg->socket_update_lock)) ||
rcu_dereference_protected(wg->sock6, lockdep_is_held(&wg->socket_update_lock))) {
ret = -EADDRINUSE;
@@ -339,7 +339,6 @@ retry:
goto out;
}
wg->incoming_port = ntohs(inet_sk(new4->sk)->inet_sport);
-
set_sock_opts(new4);
setup_udp_tunnel_sock(wg->creating_net, new4, &cfg);
rcu_assign_pointer(wg->sock4, new4->sk);