]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
dnstap query_message field was erroneously set with responses
authorEvan Hunt <each@isc.org>
Fri, 26 Aug 2022 22:38:34 +0000 (15:38 -0700)
committerEvan Hunt <each@isc.org>
Wed, 31 Aug 2022 18:33:25 +0000 (11:33 -0700)
The dnstap query_message field was in some cases being filled in
with response messages, along with the response_message field.
The query_message field should only be used when logging requests,
and the response_message field only when logging responses.

lib/dns/dnstap.c

index e0b81911b47f994b0d841ff1ba4dab2dbcacad7f..71525fa88da2f7b1c248919849caf73f4c0a01b6 100644 (file)
@@ -807,10 +807,11 @@ dns_dt_send(dns_view_t *view, dns_dtmsgtype_t msgtype, isc_sockaddr_t *qaddr,
                dm.m.response_time_nsec = isc_time_nanoseconds(t);
                dm.m.has_response_time_nsec = 1;
 
-               cpbuf(buf, &dm.m.response_message, &dm.m.has_response_message);
-
-               /* Types RR and FR get both query and response times */
-               if (msgtype == DNS_DTTYPE_CR || msgtype == DNS_DTTYPE_AR) {
+               /*
+                * Types RR and FR can fall through and get the query
+                * time set as well. Any other response type, break.
+                */
+               if (msgtype != DNS_DTTYPE_RR && msgtype != DNS_DTTYPE_FR) {
                        break;
                }
 
@@ -830,8 +831,6 @@ dns_dt_send(dns_view_t *view, dns_dtmsgtype_t msgtype, isc_sockaddr_t *qaddr,
                dm.m.has_query_time_sec = 1;
                dm.m.query_time_nsec = isc_time_nanoseconds(t);
                dm.m.has_query_time_nsec = 1;
-
-               cpbuf(buf, &dm.m.query_message, &dm.m.has_query_message);
                break;
        default:
                isc_log_write(dns_lctx, DNS_LOGCATEGORY_DNSTAP,
@@ -840,6 +839,13 @@ dns_dt_send(dns_view_t *view, dns_dtmsgtype_t msgtype, isc_sockaddr_t *qaddr,
                return;
        }
 
+       /* Query and response messages */
+       if ((msgtype & DNS_DTTYPE_QUERY) != 0) {
+               cpbuf(buf, &dm.m.query_message, &dm.m.has_query_message);
+       } else if ((msgtype & DNS_DTTYPE_RESPONSE) != 0) {
+               cpbuf(buf, &dm.m.response_message, &dm.m.has_response_message);
+       }
+
        /* Zone/bailiwick */
        switch (msgtype) {
        case DNS_DTTYPE_AR: