From: Witold Kręcicki Date: Tue, 27 Oct 2020 09:09:30 +0000 (+0100) Subject: Properly handle outer TCP connection closed in TCPDNS. X-Git-Tag: v9.17.7~36^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c41ce8e0c94ba9cc6bf18d4bbbcc977af93afbf2;p=thirdparty%2Fbind9.git Properly handle outer TCP connection closed in TCPDNS. If the connection is closed while we're processing the request we might access TCPDNS outerhandle which is already reset. Check for this condition and call the callback with ISC_R_CANCELED result. --- diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c index 6a20ea4c7c3..63391273cb1 100644 --- a/lib/isc/netmgr/tcpdns.c +++ b/lib/isc/netmgr/tcpdns.c @@ -596,9 +596,16 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region, r.base = (unsigned char *)uvreq->uvbuf.base; r.length = uvreq->uvbuf.len; - - isc_nmhandle_attach(sock->outerhandle, &sendhandle); - isc_nm_send(sock->outerhandle, &r, tcpdnssend_cb, uvreq); + if (sock->outerhandle != NULL) { + isc_nmhandle_attach(sock->outerhandle, &sendhandle); + isc_nm_send(sock->outerhandle, &r, tcpdnssend_cb, + uvreq); + } else { + cb(handle, ISC_R_CANCELED, cbarg); + isc_mem_put(sock->mgr->mctx, uvreq->uvbuf.base, + uvreq->uvbuf.len); + isc__nm_uvreq_put(&uvreq, sock); + } } else { isc__netievent_tcpdnssend_t *ievent = NULL;