From d7d95852ee2eb1cf2e068c463330f0683eb8f20e Mon Sep 17 00:00:00 2001 From: Charles-Henri Bruyand Date: Fri, 30 Sep 2022 09:31:13 +0200 Subject: [PATCH] rec: make sure data is at least the size of a dnsheader when constructing a DnstapMessage --- pdns/dnstap.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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) { -- 2.47.2