]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
remove unnecessary assertion in dns_dispatch_connect()
authorEvan Hunt <each@isc.org>
Wed, 13 Jul 2022 19:38:55 +0000 (12:38 -0700)
committerEvan Hunt <each@isc.org>
Thu, 14 Jul 2022 23:31:01 +0000 (16:31 -0700)
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
lib/dns/dispatch.c

diff --git a/CHANGES b/CHANGES
index c9ef106552e47d681921776f648b259f66966607..751bf3ff59e8d2286b1f7e30a43efd6e174146bd 100644 (file)
--- 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]
index e0ae80cbb0b7f3cb94878d4e81779f95235bd6e4..fcee9751c2e8d1bee73ee4244c027c88b14dd073 100644 (file)
@@ -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 });