]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix destination port extraction for client queries
authorMichał Kępień <michal@isc.org>
Wed, 22 Jun 2022 11:45:46 +0000 (13:45 +0200)
committerMichał Kępień <michal@isc.org>
Wed, 22 Jun 2022 11:45:46 +0000 (13:45 +0200)
The current logic for determining the address of the socket to which a
client sent its query is:

 1. Get the address:port tuple from the netmgr handle using
    isc_nmhandle_localaddr().

 2. Convert the address:port tuple from step 1 into an isc_netaddr_t
    using isc_netaddr_fromsockaddr().

 3. Convert the address from step 2 back into a socket address with the
    port set to 0 using isc_sockaddr_fromnetaddr().

Note that the port number (readily available in the netmgr handle) is
needlessly lost in the process, preventing it from being recorded in
dnstap captures of client traffic produced by named.

Fix by first storing the address:port tuple returned by
isc_nmhandle_localaddr() in client->destsockaddr and then creating an
isc_netaddr_t from that structure.  This allows the port number to be
retained in client->destsockaddr, which is what subsequently gets passed
to dns_dt_send().

lib/ns/client.c

index c6b268b9748d2f4f8712112954d003a0b259cb0c..836cedc8e1ad3e69f1dbbc7a70fc9b770a89f613 100644 (file)
@@ -1706,7 +1706,6 @@ ns__client_request(isc_nmhandle_t *handle, isc_result_t eresult,
        bool notimp;
        size_t reqsize;
        dns_aclenv_t *env = NULL;
-       isc_sockaddr_t sockaddr;
 #ifdef HAVE_DNSTAP
        dns_dtmsgtype_t dtmsgtype;
 #endif /* ifdef HAVE_DNSTAP */
@@ -2005,10 +2004,8 @@ ns__client_request(isc_nmhandle_t *handle, isc_result_t eresult,
                return;
        }
 
-       sockaddr = isc_nmhandle_localaddr(handle);
-       isc_netaddr_fromsockaddr(&client->destaddr, &sockaddr);
-
-       isc_sockaddr_fromnetaddr(&client->destsockaddr, &client->destaddr, 0);
+       client->destsockaddr = isc_nmhandle_localaddr(handle);
+       isc_netaddr_fromsockaddr(&client->destaddr, &client->destsockaddr);
 
        result = client->manager->sctx->matchingview(
                &netaddr, &client->destaddr, client->message, env, &sigresult,