From: Artem Boldariev Date: Mon, 7 Jun 2021 14:46:08 +0000 (+0300) Subject: Set sock->iface and sock->peer properly for layered connection types X-Git-Tag: v9.17.16~39^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ccd2267b1caf49ffd2f18a8fd3c1f406a37fe555;p=thirdparty%2Fbind9.git Set sock->iface and sock->peer properly for layered connection types This change sets the mentioned fields properly and gets rid of klusges added in the times when we were keeping pointers to isc_sockaddr_t instead of copies. Among other things it helps to avoid a situation when garbage instead of an address appears in dig output. --- diff --git a/lib/isc/netmgr/http.c b/lib/isc/netmgr/http.c index d087507d474..c04cb9e9d1b 100644 --- a/lib/isc/netmgr/http.c +++ b/lib/isc/netmgr/http.c @@ -140,7 +140,6 @@ struct isc_nm_http_session { isc_nmhandle_t *handle; isc_nmhandle_t *client_httphandle; isc_nmsocket_t *serversocket; - isc_sockaddr_t server_iface; uint8_t buf[MAX_DNS_MESSAGE_SIZE]; size_t bufsize; @@ -1337,6 +1336,9 @@ transport_connect_cb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) { session->client = true; transp_sock->h2.session = session; http_sock->h2.connect.tlsctx = NULL; + /* otherwise we will get some garbage output in DIG */ + http_sock->iface = handle->sock->iface; + http_sock->peer = handle->sock->peer; transp_sock->h2.connect.post = http_sock->h2.connect.post; transp_sock->h2.connect.uri = http_sock->h2.connect.uri; @@ -1604,7 +1606,8 @@ server_on_begin_headers_callback(nghttp2_session *ngsession, socket = isc_mem_get(session->mctx, sizeof(isc_nmsocket_t)); isc__nmsocket_init(socket, session->serversocket->mgr, isc_nm_httpsocket, - (isc_sockaddr_t *)&session->server_iface); + (isc_sockaddr_t *)&session->handle->sock->iface); + socket->peer = session->handle->sock->peer; socket->h2 = (isc_nmsocket_h2_t){ .buf = isc_mem_allocate(session->mctx, MAX_DNS_MESSAGE_SIZE), .psock = socket, @@ -2356,7 +2359,6 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) { isc_nmhandle_attach(handle, &session->handle); isc__nmsocket_attach(httplistensock, &session->serversocket); - session->server_iface = isc_nmhandle_localaddr(session->handle); server_send_connection_header(session); /* TODO H2 */ diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index b61c925bc34..ba74753a86a 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -886,8 +886,6 @@ struct isc_nmsocket { isc_tls_t *tls; isc_tlsctx_t *ctx; isc_nmsocket_t *tlslistener; - isc_sockaddr_t server_iface; - isc_sockaddr_t local_iface; atomic_bool result_updated; enum { TLS_INIT, diff --git a/lib/isc/netmgr/tlsstream.c b/lib/isc/netmgr/tlsstream.c index c8e7a70919d..f203a949190 100644 --- a/lib/isc/netmgr/tlsstream.c +++ b/lib/isc/netmgr/tlsstream.c @@ -577,7 +577,7 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) { */ tlssock = isc_mem_get(handle->sock->mgr->mctx, sizeof(*tlssock)); isc__nmsocket_init(tlssock, handle->sock->mgr, isc_nm_tlssocket, - &tlslistensock->tlsstream.server_iface); + &handle->sock->iface); /* We need to initialize SSL now to reference SSL_CTX properly */ tlssock->tlsstream.ctx = tlslistensock->tlsstream.ctx; @@ -619,9 +619,6 @@ isc_nm_listentls(isc_nm_t *mgr, isc_sockaddr_t *iface, tlssock = isc_mem_get(mgr->mctx, sizeof(*tlssock)); isc__nmsocket_init(tlssock, mgr, isc_nm_tlslistener, iface); - tlssock->tlsstream.server_iface = *iface; - ISC_LINK_INIT(&tlssock->tlsstream.server_iface, link); - tlssock->iface = tlssock->tlsstream.server_iface; tlssock->result = ISC_R_UNSET; tlssock->accept_cb = accept_cb; tlssock->accept_cbarg = accept_cbarg; @@ -881,9 +878,6 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, nsock = isc_mem_get(mgr->mctx, sizeof(*nsock)); isc__nmsocket_init(nsock, mgr, isc_nm_tlssocket, local); - nsock->tlsstream.local_iface = *local; - ISC_LINK_INIT(&nsock->tlsstream.local_iface, link); - nsock->iface = nsock->tlsstream.local_iface; nsock->extrahandlesize = extrahandlesize; nsock->result = ISC_R_UNSET; nsock->connect_cb = cb; @@ -891,8 +885,8 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, nsock->connect_timeout = timeout; nsock->tlsstream.ctx = ctx; - isc_nm_tcpconnect(mgr, &nsock->tlsstream.local_iface, peer, - tcp_connected, nsock, nsock->connect_timeout, 0); + isc_nm_tcpconnect(mgr, local, peer, tcp_connected, nsock, + nsock->connect_timeout, 0); } static void @@ -908,6 +902,8 @@ tcp_connected(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) { goto error; } + tlssock->iface = handle->sock->iface; + tlssock->peer = handle->sock->peer; if (isc__nm_closing(tlssock)) { result = ISC_R_CANCELED; goto error;