2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 22:45:39 +00:00

fix nmhandle attach/detach errors in tcpdnsconnect_cb()

we need to attach to the statichandle when connecting TCPDNS sockets,
same as with UDP.
This commit is contained in:
Ondřej Surý
2020-11-04 20:59:31 +01:00
parent d48e040035
commit 2191d2bf44
2 changed files with 15 additions and 3 deletions

View File

@@ -1206,7 +1206,8 @@ isc__nmhandle_get(isc_nmsocket_t *sock, isc_sockaddr_t *peer,
UNLOCK(&sock->lock); UNLOCK(&sock->lock);
if (sock->type == isc_nm_tcpsocket || 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); INSIST(sock->statichandle == NULL);

View File

@@ -736,6 +736,7 @@ tcpdnsconnect_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
void *cbarg = conn->cbarg; void *cbarg = conn->cbarg;
size_t extrahandlesize = conn->extrahandlesize; size_t extrahandlesize = conn->extrahandlesize;
isc_nmsocket_t *dnssock = NULL; isc_nmsocket_t *dnssock = NULL;
isc_nmhandle_t *readhandle = NULL;
REQUIRE(result != ISC_R_SUCCESS || VALID_NMHANDLE(handle)); 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(); dnssock->tid = isc_nm_tid();
atomic_init(&dnssock->client, true); 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, uv_timer_init(&dnssock->mgr->workers[isc_nm_tid()].loop,
&dnssock->timer); &dnssock->timer);
@@ -774,7 +781,11 @@ tcpdnsconnect_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
* packet. * packet.
*/ */
isc_nm_read(handle, dnslisten_readcb, dnssock); 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); isc__nmsocket_detach(&dnssock);
} }