]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Set sock->iface and sock->peer properly for layered connection types
authorArtem Boldariev <artem@boldariev.com>
Mon, 7 Jun 2021 14:46:08 +0000 (17:46 +0300)
committerArtem Boldariev <artem@boldariev.com>
Mon, 14 Jun 2021 08:37:36 +0000 (11:37 +0300)
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.

lib/isc/netmgr/http.c
lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/tlsstream.c

index d087507d4747cd2f6e1cbc75a9f52cb8bae2f660..c04cb9e9d1ba5177d541ee1a3766b9803280e779 100644 (file)
@@ -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 */
index b61c925bc34de964730bd3c0432478107e576a3c..ba74753a86a58e239c479c0cf2c8b83741eed445 100644 (file)
@@ -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,
index c8e7a70919d8e3e2c7a55a1e53da6121b5da7c4e..f203a9491902ab25c008af72b57d9294b48d260c 100644 (file)
@@ -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;