From: Ondřej Surý Date: Wed, 4 Nov 2020 19:59:31 +0000 (+0100) Subject: fix nmhandle attach/detach errors in tcpdnsconnect_cb() X-Git-Tag: v9.17.7~19^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2191d2bf444b3b699b995871d837e3baea4f5185;p=thirdparty%2Fbind9.git fix nmhandle attach/detach errors in tcpdnsconnect_cb() we need to attach to the statichandle when connecting TCPDNS sockets, same as with UDP. --- diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index d5cd8136467..96073495323 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -1206,7 +1206,8 @@ isc__nmhandle_get(isc_nmsocket_t *sock, isc_sockaddr_t *peer, UNLOCK(&sock->lock); if (sock->type == isc_nm_tcpsocket || - (sock->type == isc_nm_udpsocket && atomic_load(&sock->client))) + (sock->type == isc_nm_udpsocket && atomic_load(&sock->client)) || + (sock->type == isc_nm_tcpdnssocket && atomic_load(&sock->client))) { INSIST(sock->statichandle == NULL); diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c index d7d4dbb0d3f..ad85928d17c 100644 --- a/lib/isc/netmgr/tcpdns.c +++ b/lib/isc/netmgr/tcpdns.c @@ -736,6 +736,7 @@ tcpdnsconnect_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { void *cbarg = conn->cbarg; size_t extrahandlesize = conn->extrahandlesize; isc_nmsocket_t *dnssock = NULL; + isc_nmhandle_t *readhandle = NULL; REQUIRE(result != ISC_R_SUCCESS || VALID_NMHANDLE(handle)); @@ -758,7 +759,13 @@ tcpdnsconnect_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { dnssock->tid = isc_nm_tid(); atomic_init(&dnssock->client, true); - dnssock->statichandle = isc__nmhandle_get(dnssock, NULL, NULL); + + readhandle = isc__nmhandle_get(dnssock, NULL, NULL); + + INSIST(dnssock->statichandle != NULL); + INSIST(dnssock->statichandle == readhandle); + INSIST(readhandle->sock == dnssock); + INSIST(dnssock->recv_cb == NULL); uv_timer_init(&dnssock->mgr->workers[isc_nm_tid()].loop, &dnssock->timer); @@ -774,7 +781,11 @@ tcpdnsconnect_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { * packet. */ isc_nm_read(handle, dnslisten_readcb, dnssock); - cb(dnssock->statichandle, ISC_R_SUCCESS, cbarg); + cb(readhandle, ISC_R_SUCCESS, cbarg); + + /* + * The sock is now attached to the handle. + */ isc__nmsocket_detach(&dnssock); }