]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/dns.cpp
Merge pull request #1157 from SaberUK/insp20+fix-cron-restart
[user/henk/code/inspircd.git] / src / dns.cpp
index 75e5731fe93edac1951162665719424370b9b79f..3d3bc947fee2cfbee4f045e04b56b5eeb0730687 100644 (file)
@@ -121,7 +121,7 @@ class CacheTimer : public Timer
        DNS* dns;
  public:
        CacheTimer(DNS* thisdns)
-               : Timer(3600, ServerInstance->Time(), true), dns(thisdns) { }
+               : Timer(5*60, ServerInstance->Time(), true), dns(thisdns) { }
 
        virtual void Tick(time_t)
        {
@@ -162,6 +162,8 @@ class RequestTimeout : public Timer
 
 CachedQuery::CachedQuery(const std::string &res, QueryType qt, unsigned int ttl) : data(res), type(qt)
 {
+       if (ttl > 5*60)
+               ttl = 5*60;
        expires = ServerInstance->Time() + ttl;
 }
 
@@ -700,8 +702,16 @@ DNSResult DNS::GetResult()
                                /* Identical handling to PTR */
 
                        case DNS_QUERY_PTR:
+                       {
                                /* Reverse lookups just come back as char* */
                                resultstr = std::string((const char*)data.first);
+                               if (resultstr.find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-") != std::string::npos)
+                               {
+                                       std::string ro = req->orig;
+                                       delete req;
+                                       return DNSResult(this_id | ERROR_MASK, "Invalid char(s) in reply", 0, ro);
+                               }
+                       }
                        break;
 
                        default:
@@ -1050,7 +1060,11 @@ void DNS::HandleEvent(EventType, int)
                                        ServerInstance->stats->statsDnsGood++;
 
                                if (!this->GetCache(res.original.c_str()))
+                               {
+                                       if (cache->size() >= MAX_CACHE_SIZE)
+                                               cache->clear();
                                        this->cache->insert(std::make_pair(res.original.c_str(), CachedQuery(res.result, res.type, res.ttl)));
+                               }
 
                                Classes[res.id]->OnLookupComplete(res.result, res.ttl, false);
                                delete Classes[res.id];