From: Witold KrÄ™cicki Date: Sun, 8 Dec 2019 22:09:16 +0000 (+0100) Subject: Remove read callback before detaching from inner socket in tcpdns X-Git-Tag: v9.15.7~20^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a34ced776e83fb13afa55c71894dfd8f25020d5a;p=thirdparty%2Fbind9.git Remove read callback before detaching from inner socket in tcpdns --- diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 7e3972d07ae..852c3cd4d6c 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 ad53aeface3..94fb021bc65 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 */