X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_dns.cpp;h=1e8bb753389272725e5aa5bd80c4c0dd615beca9;hb=dbe5a1fc6f9e18765863f332a3e79d7c918d3e65;hp=01e911efbe5bc177be398a57cb8c6215e7d30f26;hpb=06bc8df45045a3d1fdc45f793abf7ba72b7403b1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_dns.cpp b/src/coremods/core_dns.cpp index 01e911efb..1e8bb7533 100644 --- a/src/coremods/core_dns.cpp +++ b/src/coremods/core_dns.cpp @@ -339,6 +339,10 @@ class MyManager : public Manager, public Timer, public EventHandler irc::sockets::sockaddrs myserver; + /** Maximum number of entries in cache + */ + static const unsigned int MAX_CACHE_SIZE = 1000; + static bool IsExpired(const Query& record, time_t now = ServerInstance->Time()) { const ResourceRecord& req = record.answers[0]; @@ -374,6 +378,9 @@ class MyManager : public Manager, public Timer, public EventHandler */ void AddCache(Query& r) { + if (cache.size() >= MAX_CACHE_SIZE) + cache.clear(); + // Determine the lowest TTL value and use that as the TTL of the cache entry unsigned int cachettl = UINT_MAX; for (std::vector::const_iterator i = r.answers.begin(); i != r.answers.end(); ++i) @@ -383,6 +390,7 @@ class MyManager : public Manager, public Timer, public EventHandler cachettl = rr.ttl; } + cachettl = std::min(cachettl, (unsigned int)5*60); ResourceRecord& rr = r.answers.front(); // Set TTL to what we've determined to be the lowest rr.ttl = cachettl; @@ -393,7 +401,7 @@ class MyManager : public Manager, public Timer, public EventHandler public: DNS::Request* requests[MAX_REQUEST_ID+1]; - MyManager(Module* c) : Manager(c), Timer(3600, true) + MyManager(Module* c) : Manager(c), Timer(5*60, true) { for (unsigned int i = 0; i <= MAX_REQUEST_ID; ++i) requests[i] = NULL; @@ -497,6 +505,7 @@ class MyManager : public Manager, public Timer, public EventHandler case ERROR_NOT_AN_ANSWER: case ERROR_NONSTANDARD_QUERY: case ERROR_FORMAT_ERROR: + case ERROR_MALFORMED: return "Malformed answer"; case ERROR_SERVER_FAILURE: case ERROR_NOT_IMPLEMENTED: @@ -539,17 +548,19 @@ class MyManager : public Manager, public Timer, public EventHandler } Packet recv_packet; + bool valid = false; try { recv_packet.Fill(buffer, length); + valid = true; } catch (Exception& ex) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, ex.GetReason()); - return; } + // recv_packet.id must be filled in here DNS::Request* request = this->requests[recv_packet.id]; if (request == NULL) { @@ -564,14 +575,20 @@ class MyManager : public Manager, public Timer, public EventHandler return; } - if (recv_packet.flags & QUERYFLAGS_OPCODE) + if (!valid) + { + ServerInstance->stats.DnsBad++; + recv_packet.error = ERROR_MALFORMED; + request->OnError(&recv_packet); + } + else if (recv_packet.flags & QUERYFLAGS_OPCODE) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Received a nonstandard query"); ServerInstance->stats.DnsBad++; recv_packet.error = ERROR_NONSTANDARD_QUERY; request->OnError(&recv_packet); } - else if (recv_packet.flags & QUERYFLAGS_RCODE) + else if (!(recv_packet.flags & QUERYFLAGS_QR) || (recv_packet.flags & QUERYFLAGS_RCODE)) { Error error = ERROR_UNKNOWN;