From 25ddec8a0a8e0549b69f4e601028f3323d3c1886 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Wed, 13 Jul 2022 12:38:55 -0700 Subject: [PATCH] remove unnecessary assertion in dns_dispatch_connect() When a thread calls dns_dispatch_connect() on an unconnected TCP socket it sets `tcpstate` from `DNS_DISPATCHSTATE_NONE` to `_CONNECTING`. Previously, it then INSISTed that there were no pending connections before calling isc_nm_tcpdnsconnect(). If a second thread called dns_dispatch_connect() during that window of time, it could add a pending connection to the list, and trigger an assertion failure. This commit removes the INSIST since the condition is actually harmless. --- CHANGES | 4 ++++ lib/dns/dispatch.c | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index c9ef106552..751bf3ff59 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +5927. [bug] A race was possible in dns_dispatch_connect() + that could trigger an assertion failure if two + threads called it near-simultaneously. [GL #3456] + 5926. [func] Handle transient TCP connect() EADDRINUSE failures on FreeBSD (and possibly other BSDs) by trying three times before giving up. [GL #3451] diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index e0ae80cbb0..fcee9751c2 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -1812,7 +1812,6 @@ dns_dispatch_connect(dns_dispentry_t *resp) { case DNS_DISPATCHSTATE_NONE: /* First connection, continue with connecting */ LOCK(&disp->lock); - INSIST(ISC_LIST_EMPTY(disp->pending)); ISC_LIST_APPEND(disp->pending, resp, plink); UNLOCK(&disp->lock); dns_dispatch_attach(disp, &(dns_dispatch_t *){ NULL });