]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Properly handle outer TCP connection closed in TCPDNS.
authorWitold Kręcicki <wpk@isc.org>
Tue, 27 Oct 2020 09:09:30 +0000 (10:09 +0100)
committerOndřej Surý <ondrej@isc.org>
Thu, 29 Oct 2020 11:32:25 +0000 (12:32 +0100)
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.

lib/isc/netmgr/tcpdns.c

index 6a20ea4c7c3d04aa7ec7c3c99eb698e6dccd8d7f..63391273cb158312da840555bdd520ba5dc43c40 100644 (file)
@@ -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;