From 80f7489df006e43980cacb3550245213706c802a Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Sun, 14 Feb 2021 15:17:27 +0300 Subject: [PATCH] LookupServer: Fix serializing name data in DNS answers When serializing a RR of type PTR, we should use the DNS name serialization format, not a raw string. --- Userland/Services/LookupServer/DNSName.cpp | 7 +++++++ Userland/Services/LookupServer/DNSName.h | 1 + Userland/Services/LookupServer/DNSPacket.cpp | 10 ++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Userland/Services/LookupServer/DNSName.cpp b/Userland/Services/LookupServer/DNSName.cpp index d3e8bf732a..edf8cb9fa7 100644 --- a/Userland/Services/LookupServer/DNSName.cpp +++ b/Userland/Services/LookupServer/DNSName.cpp @@ -70,6 +70,13 @@ DNSName DNSName::parse(const u8* data, size_t& offset, size_t max_offset, size_t } } +size_t DNSName::serialized_size() const +{ + if (m_name.is_empty()) + return 1; + return m_name.length() + 2; +} + OutputStream& operator<<(OutputStream& stream, const DNSName& name) { auto parts = name.as_string().split_view('.'); diff --git a/Userland/Services/LookupServer/DNSName.h b/Userland/Services/LookupServer/DNSName.h index dc0fe7b5c2..08ad651648 100644 --- a/Userland/Services/LookupServer/DNSName.h +++ b/Userland/Services/LookupServer/DNSName.h @@ -38,6 +38,7 @@ public: static DNSName parse(const u8* data, size_t& offset, size_t max_offset, size_t recursion_level = 0); + size_t serialized_size() const; const String& as_string() const { return m_name; } private: diff --git a/Userland/Services/LookupServer/DNSPacket.cpp b/Userland/Services/LookupServer/DNSPacket.cpp index b2658aa944..4723553f45 100644 --- a/Userland/Services/LookupServer/DNSPacket.cpp +++ b/Userland/Services/LookupServer/DNSPacket.cpp @@ -92,8 +92,14 @@ ByteBuffer DNSPacket::to_byte_buffer() const stream << htons(answer.type()); stream << htons(answer.class_code()); stream << htonl(answer.ttl()); - stream << htons(answer.record_data().length()); - stream << answer.record_data().bytes(); + if (answer.type() == T_PTR) { + DNSName name { answer.record_data() }; + stream << htons(name.serialized_size()); + stream << name; + } else { + stream << htons(answer.record_data().length()); + stream << answer.record_data().bytes(); + } } return stream.copy_into_contiguous_buffer();