summaryrefslogtreecommitdiffhomepage
path: root/src
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
commit4fb8ba017d796b9425be42e6ed39c4e24496e89f (patch)
treef8626b3788c3366123f3cfbfc8bea89bbd7a48d1 /src
parent9a21a03d6871292dce9115fac715b9fe85734cf7 (diff)
socket: avoid deadlock on port retry
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src')
-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);