diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 7e3972d07a..852c3cd4d6 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -765,10 +765,14 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) { .base = (unsigned char *) buf->base, .length = nread }; - - INSIST(sock->rcb.recv != NULL); - sock->rcb.recv(sock->tcphandle, ®ion, sock->rcbarg); - + /* + * This might happen if the inner socket is closing. + * It means that it's detached, so the socket will + * be closed. + */ + if (sock->rcb.recv != NULL) { + sock->rcb.recv(sock->tcphandle, ®ion, sock->rcbarg); + } sock->read_timeout = (atomic_load(&sock->keepalive) ? sock->mgr->keepalive : sock->mgr->idle); @@ -786,8 +790,14 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) { if (sock->quota) { isc_quota_detach(&sock->quota); } - sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg); - + /* + * This might happen if the inner socket is closing. + * It means that it's detached, so the socket will + * be closed. + */ + if (sock->rcb.recv != NULL) { + sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg); + } /* * We don't need to clean up now; the socket will be closed and * resources and quota reclaimed when handle is freed in @@ -1067,7 +1077,9 @@ void isc__nm_tcp_shutdown(isc_nmsocket_t *sock) { REQUIRE(VALID_NMSOCK(sock)); - if (sock->type == isc_nm_tcpsocket && sock->tcphandle != NULL) { + if (sock->type == isc_nm_tcpsocket && + sock->tcphandle != NULL && + sock->rcb.recv != NULL) { sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg); } } diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c index ad53aeface..94fb021bc6 100644 --- a/lib/isc/netmgr/tcpdns.c +++ b/lib/isc/netmgr/tcpdns.c @@ -494,6 +494,7 @@ 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); } /* We don't need atomics here, it's all in single network thread */