diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index 23156f6a91..03fb6072a8 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -810,6 +810,7 @@ struct isc_nmsocket { BIO *ssl_bio; isc_nmsocket_t *tlslistener; bool connect_from_networker; + atomic_bool result_updated; enum { TLS_INIT, TLS_HANDSHAKE, diff --git a/lib/isc/netmgr/tlsstream.c b/lib/isc/netmgr/tlsstream.c index e82fdc3254..c9f49b6f93 100644 --- a/lib/isc/netmgr/tlsstream.c +++ b/lib/isc/netmgr/tlsstream.c @@ -74,18 +74,21 @@ inactive(isc_nmsocket_t *sock) { static void update_result(isc_nmsocket_t *sock, const isc_result_t result) { - if (!sock->tlsstream.server) { - LOCK(&sock->lock); - sock->result = result; - SIGNAL(&sock->cond); - while (!atomic_load(&sock->active)) { - WAIT(&sock->scond, &sock->lock); + if (!atomic_load(&sock->tlsstream.result_updated)) { + atomic_store(&sock->tlsstream.result_updated, true); + if (!sock->tlsstream.server) { + LOCK(&sock->lock); + sock->result = result; + SIGNAL(&sock->cond); + while (!atomic_load(&sock->active)) { + WAIT(&sock->scond, &sock->lock); + } + UNLOCK(&sock->lock); + } else { + LOCK(&sock->lock); + sock->result = result; + UNLOCK(&sock->lock); } - UNLOCK(&sock->lock); - } else { - LOCK(&sock->lock); - sock->result = result; - UNLOCK(&sock->lock); } }