From: Charles-Henri Bruyand Date: Fri, 30 Sep 2022 07:31:13 +0000 (+0200) Subject: rec: make sure data is at least the size of a dnsheader when constructing a DnstapMessage X-Git-Tag: rec-4.9.0-alpha0~1^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d7d95852ee2eb1cf2e068c463330f0683eb8f20e;p=thirdparty%2Fpdns.git rec: make sure data is at least the size of a dnsheader when constructing a DnstapMessage --- diff --git a/pdns/dnstap.cc b/pdns/dnstap.cc index d0fd632eb2..212c3b5f8f 100644 --- a/pdns/dnstap.cc +++ b/pdns/dnstap.cc @@ -31,7 +31,6 @@ DnstapMessage::DnstapMessage(std::string& buffer, DnstapMessage::MessageType typ pbf.add_bytes(DnstapBaseFields::version, PACKAGE_STRING); pbf.add_enum(DnstapBaseFields::type, DnstapMessageTypes::message); - const struct dnsheader* dh = reinterpret_cast(packet); protozero::pbf_writer pbf_message{pbf, DnstapBaseFields::message}; pbf_message.add_enum(DnstapMessageFields::type, static_cast(type)); @@ -74,10 +73,13 @@ DnstapMessage::DnstapMessage(std::string& buffer, DnstapMessage::MessageType typ pbf_message.add_fixed32(DnstapMessageFields::response_time_nsec, responseTime->tv_nsec); } - if (!dh->qr) { - pbf_message.add_bytes(DnstapMessageFields::query_message, packet, len); - } else { - pbf_message.add_bytes(DnstapMessageFields::response_message, packet, len); + if (packet != nullptr && len >= sizeof(dnsheader)) { + const struct dnsheader* dh = reinterpret_cast(packet); + if (!dh->qr) { + pbf_message.add_bytes(DnstapMessageFields::query_message, packet, len); + } else { + pbf_message.add_bytes(DnstapMessageFields::response_message, packet, len); + } } if (auth) {