From: Remi Gacogne Date: Fri, 20 Jul 2018 13:15:15 +0000 (+0200) Subject: rec: Use a string instead of a fixed 65k buffer for TCP connections X-Git-Tag: dnsdist-1.3.3~169^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2749c3fe5433bf27e49b65022f98c67017ae6b4c;p=thirdparty%2Fpdns.git rec: Use a string instead of a fixed 65k buffer for TCP connections --- diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 3f8a29f335..e6ac33fc06 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -234,8 +234,9 @@ bool g_logRPZChanges{false}; //! used to send information to a newborn mthread struct DNSComboWriter { - DNSComboWriter(const char* data, uint16_t len, const struct timeval& now): d_mdp(true, data, len), d_now(now) - {} + DNSComboWriter(const std::string& query, const struct timeval& now): d_mdp(true, query.c_str(), query.size()), d_now(now) + { + } DNSComboWriter(const std::string& query, const struct timeval& now, std::vector&& policyTags, LuaContext::LuaObject&& data): d_mdp(true, query.c_str(), query.size()), d_now(now), d_policyTags(std::move(policyTags)), d_data(std::move(data)) { @@ -705,7 +706,7 @@ static void writePid(void) g_log< conn=any_cast >(var); if(conn->state==TCPConnection::BYTE0) { - ssize_t bytes=recv(conn->getFD(), conn->data, 2, 0); + ssize_t bytes=recv(conn->getFD(), &conn->data[0], 2, 0); if(bytes==1) conn->state=TCPConnection::BYTE1; if(bytes==2) { conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1]; + conn->data.resize(conn->qlen); conn->bytesread=0; conn->state=TCPConnection::GETQUESTION; } @@ -1711,10 +1713,11 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) } } else if(conn->state==TCPConnection::BYTE1) { - ssize_t bytes=recv(conn->getFD(), conn->data+1, 1, 0); + ssize_t bytes=recv(conn->getFD(), &conn->data[1], 1, 0); if(bytes==1) { conn->state=TCPConnection::GETQUESTION; conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1]; + conn->data.resize(conn->qlen); conn->bytesread=0; } if(!bytes || bytes < 0) { @@ -1725,7 +1728,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) } } else if(conn->state==TCPConnection::GETQUESTION) { - ssize_t bytes=recv(conn->getFD(), conn->data + conn->bytesread, conn->qlen - conn->bytesread, 0); + ssize_t bytes=recv(conn->getFD(), &conn->data[conn->bytesread], conn->qlen - conn->bytesread, 0); if(!bytes || bytes < 0 || bytes > std::numeric_limits::max()) { g_log<d_remote.toStringWithPort() <<" disconnected while reading question body"<removeReadFD(fd); @@ -1737,7 +1740,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) DNSComboWriter* dc=nullptr; try { - dc=new DNSComboWriter(conn->data, conn->qlen, g_now); + dc=new DNSComboWriter(conn->data, g_now); } catch(MOADNSException &mde) { g_stats.clientParseError++; @@ -1779,7 +1782,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) bool xpfFound = false; dc->d_ecsParsed = true; dc->d_ecsFound = false; - getQNameAndSubnet(std::string(conn->data, conn->qlen), &qname, &qtype, &qclass, + getQNameAndSubnet(conn->data, &qname, &qtype, &qclass, dc->d_ecsFound, &dc->d_ednssubnet, g_gettagNeedsEDNSOptions ? &ednsOptions : nullptr, xpfFound, needXPF ? &dc->d_source : nullptr, needXPF ? &dc->d_destination : nullptr); @@ -1813,7 +1816,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) if(t_protobufServer) { try { - const struct dnsheader* dh = (const struct dnsheader*) conn->data; + const struct dnsheader* dh = reinterpret_cast(&conn->data[0]); if (logQuery && !(luaconfsLocal->protobufExportConfig.taggedOnly && dc->d_policyTags.empty())) { protobufLogQuery(t_protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, dc->d_uuid, dc->d_source, dc->d_destination, dc->d_ednssubnet.source, true, dh->id, conn->qlen, qname, qtype, qclass, dc->d_policyTags, dc->d_requestorId, dc->d_deviceId); diff --git a/pdns/syncres.hh b/pdns/syncres.hh index cfd5c4314a..3fc515d79c 100644 --- a/pdns/syncres.hh +++ b/pdns/syncres.hh @@ -940,12 +940,13 @@ public: { return d_fd; } + + std::string data; + const ComboAddress d_remote; + size_t queriesCount{0}; enum stateenum {BYTE0, BYTE1, GETQUESTION, DONE} state{BYTE0}; uint16_t qlen{0}; uint16_t bytesread{0}; - const ComboAddress d_remote; - char data[65535]; // damn - size_t queriesCount{0}; static unsigned int getCurrentConnections() { return s_currentConnections; } private: