From 9b62481a677db64712c61d53b6bf346fd5dd97a0 Mon Sep 17 00:00:00 2001 From: dmiller Date: Fri, 14 Aug 2026 17:16:20 +0000 Subject: [PATCH] Simplify putDomainName and add length checks --- libnetutil/massdns.cc | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/libnetutil/massdns.cc b/libnetutil/massdns.cc index 06fb4e021..58a35f95c 100644 --- a/libnetutil/massdns.cc +++ b/libnetutil/massdns.cc @@ -1852,28 +1852,38 @@ size_t DNS::Factory::putUnsignedShort(u16 num, u8 *buf, size_t offset, size_t ma size_t DNS::Factory::putDomainName(const std::string &name, u8 *buf, size_t offset, size_t maxlen) { size_t ret=0; - if( !( buf && (maxlen > (offset + name.length() + 1))) ) return ret; + assert(buf != NULL); + if (offset >= maxlen || name.length() >= maxlen - offset) + return 0; - std::string namew = name + "."; - std::string accumulator; - for (std::string::const_iterator c=namew.begin(); c != namew.end(); ++c) + u8 *out = buf + offset; + size_t label_start = ret; + u8 label_len = 0; + out[ret++] = 0; // placeholder for label length + for (std::string::const_iterator c=name.begin(); c != name.end(); ++c) { + if (ret >= DNS_NAME_MAX_LENGTH) + return 0; + if((*c)=='.') { - u8 length = accumulator.length(); - *(buf+offset+ret) = length; - ret += 1; - - memcpy(buf+offset+ret, accumulator.c_str(), length); - ret += length; - accumulator.clear(); + out[label_start] = label_len; + label_len = 0; + label_start = ret; + out[ret++] = 0; // placeholder for label length + } + else { + if (label_len >= DNS_LABEL_MAX_LENGTH) + return 0; + out[ret++] = *c; + label_len++; } - else - accumulator += (*c); } - - *(buf+offset+ret) = 0; - ret += 1; + if (label_len > 0) + { + out[label_start] = label_len; + out[ret++] = 0; // Empty label terminates name + } return ret; }