Index: head/dns/bind916/Makefile =================================================================== --- head/dns/bind916/Makefile (revision 527872) +++ head/dns/bind916/Makefile (revision 527873) @@ -1,272 +1,273 @@ # $FreeBSD$ # pkg-help formatted with fmt 59 63 PORTNAME= bind PORTVERSION= ${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/} .if defined(BIND_TOOLS_SLAVE) # dns/bind-tools here PORTREVISION= 0 .else # dns/bind916 here -PORTREVISION= 1 +PORTREVISION= 2 .endif CATEGORIES= dns net MASTER_SITES= ISC/bind9/${ISCVERSION} .if defined(BIND_TOOLS_SLAVE) PKGNAMESUFFIX= -tools .else PKGNAMESUFFIX= 916 .endif DISTNAME= ${PORTNAME}-${ISCVERSION} MAINTAINER= mat@FreeBSD.org .if defined(BIND_TOOLS_SLAVE) COMMENT= Command line tools from BIND: delv, dig, host, nslookup... .else COMMENT= BIND DNS suite with updated DNSSEC and DNS64 .endif # Uncomment when bind920 comes of age. # DEPRECATED= End of life, please migrate to a newer version of BIND9 # EXPIRATION_DATE= 2023-12-31 LICENSE= MPL20 LICENSE_FILE= ${WRKSRC}/COPYRIGHT LIB_DEPENDS= libuv.so:devel/libuv \ libxml2.so:textproc/libxml2 .if !defined(BIND_TOOLS_SLAVE) RUN_DEPENDS= bind-tools>0:dns/bind-tools .endif USES= compiler:c11 cpe libedit pkgconfig ssl tar:xz # ISC releases things like 9.8.0-P1, which our versioning doesn't like ISCVERSION= 9.16.0 CPE_VENDOR= isc CPE_VERSION= ${ISCVERSION:C/-.*//} .if ${ISCVERSION:M*-*} CPE_UPDATE= ${ISCVERSION:C/.*-//:tl} .endif GNU_CONFIGURE= yes CONFIGURE_ARGS= --disable-linux-caps \ --localstatedir=/var \ --sysconfdir=${ETCDIR} \ --with-dlopen=yes \ --with-libxml2 \ --with-openssl=${OPENSSLBASE} \ --with-readline="-L${LOCALBASE}/lib -ledit" ETCDIR= ${PREFIX}/etc/namedb .if defined(BIND_TOOLS_SLAVE) CONFIGURE_ARGS+= --disable-shared EXTRA_PATCHES= ${PATCHDIR}/extrapatch-bind-tools .else USE_RC_SUBR= named SUB_FILES= named.conf pkg-message -EXTRA_PATCHES= ${PATCHDIR}/extrapatch-no-bind-tools +EXTRA_PATCHES= ${PATCHDIR}/extrapatch-no-bind-tools \ + ${PATCHDIR}/bind-v9.16.0-tcp_quota_fix.patch:-p1 PORTDOCS= * CONFLICTS= bind911 bind912 bind913 bind914 bind9-devel .endif # BIND_TOOLS_SLAVE MAKE_JOBS_UNSAFE= yes OPTIONS_DEFAULT= DLZ_FILESYSTEM GSSAPI_NONE IDN JSON LMDB PYTHON \ SIGCHASE TCP_FASTOPEN OPTIONS_DEFINE= DNSTAP DOCS FIXED_RRSET GEOIP IDN JSON LARGE_FILE LMDB \ OVERRIDECACHE PORTREVISION PYTHON QUERYTRACE SIGCHASE \ START_LATE TCP_FASTOPEN TUNING_LARGE OPTIONS_RADIO= CRYPTO OPTIONS_RADIO_CRYPTO= NATIVE_PKCS11 OPTIONS_GROUP= DLZ OPTIONS_GROUP_DLZ= DLZ_BDB DLZ_FILESYSTEM DLZ_LDAP DLZ_MYSQL \ DLZ_POSTGRESQL DLZ_STUB OPTIONS_SINGLE= GSSAPI OPTIONS_SINGLE_GSSAPI= GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE .if defined(BIND_TOOLS_SLAVE) OPTIONS_EXCLUDE= ${OPTIONS_GROUP_DLZ} DNSTAP DOCS GEOIP LMDB \ OVERRIDECACHE PORTREVISION QUERYTRACE START_LATE \ TCP_FASTOPEN TUNING_LARGE .else OPTIONS_EXCLUDE= PYTHON .endif # BIND_TOOLS_SLAVE OPTIONS_SUB= yes CRYPTO_DESC= Choose which crypto engine to use DLZ_BDB_DESC= DLZ BDB driver DLZ_DESC= Dynamically Loadable Zones DLZ_FILESYSTEM_DESC= DLZ filesystem driver DLZ_LDAP_DESC= DLZ LDAP driver DLZ_MYSQL_DESC= DLZ MySQL driver (no threading) DLZ_POSTGRESQL_DESC= DLZ Postgres driver DLZ_STUB_DESC= DLZ stub driver DNSTAP_DESC= Provides fast passive logging of DNS messages FIXED_RRSET_DESC= Enable fixed rrset ordering GSSAPI_BASE_DESC= Using Heimdal in base GSSAPI_HEIMDAL_DESC= Using security/heimdal GSSAPI_MIT_DESC= Using security/krb5 GSSAPI_NONE_DESC= Disable LARGE_FILE_DESC= 64-bit file support LMDB_DESC= Use LMDB for zone management OVERRIDECACHE_DESC= Use the override-cache patch NATIVE_PKCS11_DESC= Use PKCS\#11 native API (**READ HELP**) PORTREVISION_DESC= Show PORTREVISION in the version string PYTHON_DESC= Build with Python utilities QUERYTRACE_DESC= Enable the very verbose query tracelogging SIGCHASE_DESC= dig/host/nslookup will do DNSSEC validation START_LATE_DESC= Start BIND late in the boot process (see help) TCP_FASTOPEN_DESC= RFC 7413 support TUNING_LARGE_DESC= Tune named for large systems (**READ HELP**) DLZ_BDB_CONFIGURE_ON= --with-dlz-bdb=yes DLZ_BDB_USES= bdb DLZ_FILESYSTEM_CONFIGURE_ON= --with-dlz-filesystem=yes DLZ_LDAP_CONFIGURE_ON= --with-dlz-ldap=yes DLZ_LDAP_USE= OPENLDAP=yes DLZ_MYSQL_CONFIGURE_ON= --with-dlz-mysql=yes DLZ_MYSQL_USES= mysql DLZ_POSTGRESQL_CONFIGURE_ON= --with-dlz-postgres=yes DLZ_POSTGRESQL_USES= pgsql DLZ_STUB_CONFIGURE_ON= --with-dlz-stub=yes DNSTAP_CONFIGURE_ENABLE= dnstap DNSTAP_LIB_DEPENDS= libfstrm.so:devel/fstrm \ libprotobuf-c.so:devel/protobuf-c FIXED_RRSET_CONFIGURE_ENABLE= fixed-rrset GEOIP_CONFIGURE_ENABLE= geoip GEOIP_CONFIGURE_WITH= maxminddb GEOIP_LIB_DEPENDS= libmaxminddb.so:net/libmaxminddb GSSAPI_BASE_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} \ KRB5CONFIG="${KRB5CONFIG}" GSSAPI_BASE_USES= gssapi GSSAPI_HEIMDAL_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} \ KRB5CONFIG="${KRB5CONFIG}" GSSAPI_HEIMDAL_USES= gssapi:heimdal GSSAPI_MIT_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} \ KRB5CONFIG="${KRB5CONFIG}" GSSAPI_MIT_USES= gssapi:mit GSSAPI_NONE_CONFIGURE_ON= --without-gssapi IDN_CONFIGURE_OFF= --without-libidn2 IDN_CONFIGURE_ON= ${ICONV_CONFIGURE_BASE} \ --with-libidn2=${LOCALBASE} IDN_LIB_DEPENDS= libidn2.so:dns/libidn2 IDN_USES= iconv JSON_CONFIGURE_WITH= json-c JSON_LIB_DEPENDS= libjson-c.so:devel/json-c JSON_LDFLAGS= -L${LOCALBASE}/lib -ljson-c LARGE_FILE_CONFIGURE_ENABLE= largefile LMDB_CONFIGURE_WITH= lmdb=${LOCALBASE} LMDB_LIB_DEPENDS= liblmdb.so:databases/lmdb OVERRIDECACHE_EXTRA_PATCHES= ${FILESDIR}/extrapatch-bind-min-override-ttl NATIVE_PKCS11_CONFIGURE_ENABLE= native-pkcs11 PYTHON_BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}ply>=0:devel/py-ply@${PY_FLAVOR} PYTHON_CONFIGURE_WITH= python=${PYTHON_CMD} PYTHON_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}ply>=0:devel/py-ply@${PY_FLAVOR} PYTHON_USES= python QUERYTRACE_CONFIGURE_ENABLE= querytrace SIGCHASE_CONFIGURE_ON= STD_CDEFINES="-DDIG_SIGCHASE=1" START_LATE_SUB_LIST= NAMED_BEFORE="LOGIN" \ NAMED_REQUIRE="SERVERS cleanvar" START_LATE_SUB_LIST_OFF= NAMED_BEFORE="SERVERS" \ NAMED_REQUIRE="NETWORKING ldconfig syslogd" TCP_FASTOPEN_CONFIGURE_ENABLE= tcp-fastopen TUNING_LARGE_CONFIGURE_ON= --with-tuning=large TUNING_LARGE_CONFIGURE_OFF= --with-tuning=default .include .if defined(WITH_DEBUG) CONFIGURE_ARGS+= --enable-developer \ --enable-symtable USES+= perl5 USE_PERL5= build BUILD_DEPENDS+= cmocka>0:sysutils/cmocka .else CONFIGURE_ARGS+= --disable-symtable .endif .include .if ${SSL_DEFAULT} == base SUB_LIST+= ENGINES=/usr/lib/engines .else SUB_LIST+= ENGINES=${LOCALBASE}/lib/engines .endif post-patch: .for FILE in check/named-checkconf.8 named/named.8 nsupdate/nsupdate.1 \ rndc/rndc.8 @${REINPLACE_CMD} -e 's#/etc/named.conf#${ETCDIR}/named.conf#g' \ -e 's#/etc/rndc.conf#${ETCDIR}/rndc.conf#g' \ -e "s#/var\/run\/named\/named.pid#/var/run/named/pid#" \ ${WRKSRC}/bin/${FILE} .endfor .if !defined(BIND_TOOLS_SLAVE) . if ${PORTREVISION:N0} post-patch-PORTREVISION-on: @${REINPLACE_CMD} -e '/EXTENSIONS/s#=$$#=_${PORTREVISION}#' \ ${WRKSRC}/version . endif post-install: ${MKDIR} ${STAGEDIR}${PREFIX}/etc/mtree ${MKDIR} ${STAGEDIR}${ETCDIR} . for i in dynamic master slave working @${MKDIR} ${STAGEDIR}${ETCDIR}/$i . endfor ${INSTALL_DATA} ${WRKDIR}/named.conf ${STAGEDIR}${ETCDIR}/named.conf.sample ${INSTALL_DATA} ${FILESDIR}/named.root ${STAGEDIR}${ETCDIR} ${INSTALL_DATA} ${FILESDIR}/empty.db ${STAGEDIR}${ETCDIR}/master ${INSTALL_DATA} ${FILESDIR}/localhost-forward.db ${STAGEDIR}${ETCDIR}/master ${INSTALL_DATA} ${FILESDIR}/localhost-reverse.db ${STAGEDIR}${ETCDIR}/master ${INSTALL_DATA} ${FILESDIR}/BIND.chroot.dist ${STAGEDIR}${PREFIX}/etc/mtree/BIND.chroot.dist.sample ${INSTALL_DATA} ${FILESDIR}/BIND.chroot.local.dist ${STAGEDIR}${PREFIX}/etc/mtree/BIND.chroot.local.dist.sample ${INSTALL_DATA} ${WRKSRC}/bin/rndc/rndc.conf \ ${STAGEDIR}${ETCDIR}/rndc.conf.sample post-install-DOCS-on: ${MKDIR} ${STAGEDIR}${DOCSDIR}/arm ${INSTALL_DATA} ${WRKSRC}/doc/arm/*.html ${STAGEDIR}${DOCSDIR}/arm ${INSTALL_DATA} ${WRKSRC}/doc/arm/Bv9ARM.pdf ${STAGEDIR}${DOCSDIR} ${INSTALL_DATA} ${WRKSRC}/CHANGES* ${WRKSRC}/HISTORY.md \ ${WRKSRC}/README.md ${STAGEDIR}${DOCSDIR} .else # Can't use USE_PYTHON=autoplist post-install-PYTHON-on: @${FIND} ${STAGEDIR}${PYTHON_SITELIBDIR} -type f | ${SED} -e 's|${STAGEDIR}||' >> ${TMPPLIST} .endif # BIND_TOOLS_SLAVE .include Index: head/dns/bind916/files/bind-v9.16.0-tcp_quota_fix.patch =================================================================== --- head/dns/bind916/files/bind-v9.16.0-tcp_quota_fix.patch (nonexistent) +++ head/dns/bind916/files/bind-v9.16.0-tcp_quota_fix.patch (revision 527873) @@ -0,0 +1,341 @@ +diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h +index ae83f943d3..c85065f39d 100644 +--- a/lib/isc/netmgr/netmgr-int.h ++++ b/lib/isc/netmgr/netmgr-int.h +@@ -356,7 +356,16 @@ struct isc_nmsocket { + */ + isc_quota_t *quota; + isc_quota_t *pquota; +- bool overquota; ++ ++ /*% ++ * How many connections we have not accepted due to quota? ++ * When we close a connection we need to accept a new one. ++ */ ++ int overquota; ++ /*% ++ * How many active connections we have? ++ */ ++ int conns; + + /*% + * Socket statistics +diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c +index f4361575cc..26728c1ba6 100644 +--- a/lib/isc/netmgr/netmgr.c ++++ b/lib/isc/netmgr/netmgr.c +@@ -727,6 +727,11 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree) + for (int i = 0; i < sock->nchildren; i++) { + if (!atomic_load(&sock->children[i].destroying)) { + nmsocket_cleanup(&sock->children[i], false); ++ if (sock->statsindex != NULL) { ++ isc__nm_decstats( ++ sock->mgr, ++ sock->statsindex[STATID_ACTIVE]); ++ } + } + } + +@@ -738,6 +743,9 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree) + sock->children = NULL; + sock->nchildren = 0; + } ++ if (sock->statsindex != NULL) { ++ isc__nm_decstats(sock->mgr, sock->statsindex[STATID_ACTIVE]); ++ } + + if (sock->tcphandle != NULL) { + isc_nmhandle_unref(sock->tcphandle); +@@ -854,8 +862,6 @@ isc__nmsocket_prep_destroy(isc_nmsocket_t *sock) + if (sock->children != NULL) { + for (int i = 0; i < sock->nchildren; i++) { + atomic_store(&sock->children[i].active, false); +- isc__nm_decstats(sock->mgr, +- sock->statsindex[STATID_ACTIVE]); + } + } + +diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c +index a83fede0d2..58ffd3c404 100644 +--- a/lib/isc/netmgr/tcp.c ++++ b/lib/isc/netmgr/tcp.c +@@ -26,12 +26,28 @@ + #include + #include + #include ++#include + #include + #include + + #include "netmgr-int.h" + #include "uv-compat.h" + ++static atomic_uint_fast32_t last_tcpquota_log = ATOMIC_VAR_INIT(0); ++ ++static bool ++can_log_tcp_quota() { ++ isc_stdtime_t now, last; ++ ++ isc_stdtime_get(&now); ++ last = atomic_exchange_relaxed(&last_tcpquota_log, now); ++ if (now != last) { ++ return (true); ++ } ++ ++ return (false); ++} ++ + static int + tcp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req); + +@@ -668,9 +684,6 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) + } + + isc__nm_free_uvbuf(sock, buf); +- if (sock->quota) { +- isc_quota_detach(&sock->quota); +- } + + /* + * This might happen if the inner socket is closing. It means that +@@ -699,6 +712,7 @@ accept_connection(isc_nmsocket_t *ssock) + struct sockaddr_storage ss; + isc_sockaddr_t local; + int r; ++ bool overquota = false; + + REQUIRE(VALID_NMSOCK(ssock)); + REQUIRE(ssock->tid == isc_nm_tid()); +@@ -711,10 +725,25 @@ accept_connection(isc_nmsocket_t *ssock) + + if (ssock->pquota != NULL) { + result = isc_quota_attach(ssock->pquota, "a); ++ ++ /* ++ * We share the quota between all TCP sockets. Others ++ * may have used up all the quota slots, in which case ++ * this socket could starve. So we only fail here if we ++ * already had at least one active connection on this ++ * socket. This guarantees that we'll maintain some level ++ * of service while over quota, and will resume normal ++ * service when the quota comes back down. ++ */ + if (result != ISC_R_SUCCESS) { +- isc__nm_incstats(ssock->mgr, +- ssock->statsindex[STATID_ACCEPTFAIL]); +- return (result); ++ ssock->overquota++; ++ overquota = true; ++ if (ssock->conns > 0) { ++ isc__nm_incstats( ++ ssock->mgr, ++ ssock->statsindex[STATID_ACCEPTFAIL]); ++ return (result); ++ } + } + } + +@@ -761,6 +790,7 @@ accept_connection(isc_nmsocket_t *ssock) + } + + isc_nmsocket_attach(ssock, &csock->server); ++ ssock->conns++; + + handle = isc__nmhandle_get(csock, NULL, &local); + +@@ -779,6 +809,9 @@ error: + if (csock->quota != NULL) { + isc_quota_detach(&csock->quota); + } ++ if (overquota) { ++ ssock->overquota--; ++ } + /* We need to detach it properly to make sure uv_close is called. */ + isc_nmsocket_detach(&csock); + return (result); +@@ -793,14 +826,14 @@ tcp_connection_cb(uv_stream_t *server, int status) + UNUSED(status); + + result = accept_connection(ssock); +- if (result != ISC_R_SUCCESS) { +- if (result == ISC_R_QUOTA || result == ISC_R_SOFTQUOTA) { +- ssock->overquota = true; ++ if (result != ISC_R_SUCCESS && result != ISC_R_NOCONN) { ++ if ((result != ISC_R_QUOTA && result != ISC_R_SOFTQUOTA) || ++ can_log_tcp_quota()) { ++ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, ++ ISC_LOGMODULE_NETMGR, ISC_LOG_ERROR, ++ "TCP connection failed: %s", ++ isc_result_totext(result)); + } +- isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, +- ISC_LOGMODULE_NETMGR, ISC_LOG_ERROR, +- "TCP connection failed: %s", +- isc_result_totext(result)); + } + } + +@@ -936,17 +969,27 @@ tcp_close_direct(isc_nmsocket_t *sock) + REQUIRE(VALID_NMSOCK(sock)); + REQUIRE(sock->tid == isc_nm_tid()); + REQUIRE(sock->type == isc_nm_tcpsocket); ++ isc_nmsocket_t *ssock = sock->server; + + if (sock->quota != NULL) { +- isc_nmsocket_t *ssock = sock->server; +- + isc_quota_detach(&sock->quota); +- +- if (ssock->overquota) { ++ } ++ if (ssock != NULL) { ++ ssock->conns--; ++ while (ssock->conns == 0 && ssock->overquota > 0) { ++ ssock->overquota--; + isc_result_t result = accept_connection(ssock); +- if (result != ISC_R_QUOTA && +- result != ISC_R_SOFTQUOTA) { +- ssock->overquota = false; ++ if (result == ISC_R_SUCCESS || result == ISC_R_NOCONN) { ++ continue; ++ } ++ if ((result != ISC_R_QUOTA && ++ result != ISC_R_SOFTQUOTA) || ++ can_log_tcp_quota()) { ++ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, ++ ISC_LOGMODULE_NETMGR, ++ ISC_LOG_ERROR, ++ "TCP connection failed: %s", ++ isc_result_totext(result)); + } + } + } +diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c +index e384b73be9..f89eb359af 100644 +--- a/lib/isc/netmgr/tcpdns.c ++++ b/lib/isc/netmgr/tcpdns.c +@@ -43,6 +43,9 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg); + static void + resume_processing(void *arg); + ++static void ++tcpdns_close_direct(isc_nmsocket_t *sock); ++ + static inline size_t + dnslen(unsigned char *base) + { +@@ -82,7 +85,6 @@ timer_close_cb(uv_handle_t *handle) + { + isc_nmsocket_t *sock = (isc_nmsocket_t *)uv_handle_get_data(handle); + INSIST(VALID_NMSOCK(sock)); +- atomic_store(&sock->closed, true); + isc_nmsocket_detach(&sock); + } + +@@ -94,9 +96,7 @@ dnstcp_readtimeout(uv_timer_t *timer) + + REQUIRE(VALID_NMSOCK(sock)); + REQUIRE(sock->tid == isc_nm_tid()); +- +- isc_nmsocket_detach(&sock->outer); +- uv_close((uv_handle_t *)&sock->timer, timer_close_cb); ++ tcpdns_close_direct(sock); + } + + /* +@@ -252,7 +252,9 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) + * We have a packet: stop timeout timers + */ + atomic_store(&dnssock->outer->processing, true); +- uv_timer_stop(&dnssock->timer); ++ if (dnssock->timer_initialized) { ++ uv_timer_stop(&dnssock->timer); ++ } + + if (atomic_load(&dnssock->sequential)) { + /* +@@ -399,8 +401,10 @@ resume_processing(void *arg) + if (atomic_load(&sock->ah) == 0) { + /* Nothing is active; sockets can timeout now */ + atomic_store(&sock->outer->processing, false); +- uv_timer_start(&sock->timer, dnstcp_readtimeout, +- sock->read_timeout, 0); ++ if (sock->timer_initialized) { ++ uv_timer_start(&sock->timer, dnstcp_readtimeout, ++ sock->read_timeout, 0); ++ } + } + + /* +@@ -413,7 +417,9 @@ resume_processing(void *arg) + result = processbuffer(sock, &handle); + if (result == ISC_R_SUCCESS) { + atomic_store(&sock->outer->processing, true); +- uv_timer_stop(&sock->timer); ++ if (sock->timer_initialized) { ++ uv_timer_stop(&sock->timer); ++ } + isc_nmhandle_unref(handle); + } else if (sock->outer != NULL) { + isc_nm_resumeread(sock->outer); +@@ -441,7 +447,9 @@ resume_processing(void *arg) + break; + } + +- uv_timer_stop(&sock->timer); ++ if (sock->timer_initialized) { ++ uv_timer_stop(&sock->timer); ++ } + atomic_store(&sock->outer->processing, true); + isc_nmhandle_unref(dnshandle); + } while (atomic_load(&sock->ah) < TCPDNS_CLIENTS_PER_CONN); +@@ -507,18 +515,29 @@ static void + tcpdns_close_direct(isc_nmsocket_t *sock) + { + REQUIRE(sock->tid == isc_nm_tid()); +- if (sock->outer != NULL) { +- sock->outer->rcb.recv = NULL; +- isc_nmsocket_detach(&sock->outer); +- } +- if (sock->listener != NULL) { +- isc_nmsocket_detach(&sock->listener); +- } + /* We don't need atomics here, it's all in single network thread */ + if (sock->timer_initialized) { ++ /* ++ * We need to fire the timer callback to clean it up, ++ * it will then call us again (via detach) so that we ++ * can finally close the socket. ++ */ + sock->timer_initialized = false; + uv_timer_stop(&sock->timer); + uv_close((uv_handle_t *)&sock->timer, timer_close_cb); ++ } else { ++ /* ++ * At this point we're certain that there are no external ++ * references, we can close everything. ++ */ ++ if (sock->outer != NULL) { ++ sock->outer->rcb.recv = NULL; ++ isc_nmsocket_detach(&sock->outer); ++ } ++ if (sock->listener != NULL) { ++ isc_nmsocket_detach(&sock->listener); ++ } ++ atomic_store(&sock->closed, true); + } + } + +diff --git a/lib/isc/netmgr/uverr2result.c b/lib/isc/netmgr/uverr2result.c +index b6a8065e3e..9781454ca6 100644 +--- a/lib/isc/netmgr/uverr2result.c ++++ b/lib/isc/netmgr/uverr2result.c +@@ -38,6 +38,8 @@ isc___nm_uverr2result(int uverr, bool dolog, const char *file, + return (ISC_R_INVALIDFILE); + case UV_ENOENT: + return (ISC_R_FILENOTFOUND); ++ case UV_EAGAIN: ++ return (ISC_R_NOCONN); + case UV_EACCES: + case UV_EPERM: + return (ISC_R_NOPERM); Property changes on: head/dns/bind916/files/bind-v9.16.0-tcp_quota_fix.patch ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property