From 70b19468963c55357bb9bbd8ea1307e8df79503f Mon Sep 17 00:00:00 2001 From: Artem Boldariev Date: Thu, 11 Feb 2021 16:01:34 +0200 Subject: [PATCH] fixup! HACK: make isc_nm_tlsconnect() work when being invoked from within the context of a network thread --- lib/isc/netmgr/netmgr-int.h | 1 + lib/isc/netmgr/tlsstream.c | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) 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); } }