diff options
author | Adam <Adam@anope.org> | 2014-09-08 16:58:50 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2014-09-08 18:19:00 -0400 |
commit | df67ab549bcc2cd53519f309110c58c00f2c935b (patch) | |
tree | 39bccb74584d359ef8540c3ee6df44dc34093d20 | |
parent | 8125a187b17f41a199cc4ebaa99f4d616e930049 (diff) |
Do not use the result of the dns cache when the query type of the result is different from the type of the query. #66
-rw-r--r-- | include/dns.h | 54 | ||||
-rw-r--r-- | src/dns.cpp | 10 |
2 files changed, 36 insertions, 28 deletions
diff --git a/include/dns.h b/include/dns.h index 27c3c8848..95abaaf80 100644 --- a/include/dns.h +++ b/include/dns.h @@ -44,6 +44,28 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "hashcomp.h" /** + * Query and resource record types + */ +enum QueryType +{ + /** Uninitialized Query */ + DNS_QUERY_NONE = 0, + /** 'A' record: an ipv4 address */ + DNS_QUERY_A = 1, + /** 'CNAME' record: An alias */ + DNS_QUERY_CNAME = 5, + /** 'PTR' record: a hostname */ + DNS_QUERY_PTR = 12, + /** 'AAAA' record: an ipv6 address */ + DNS_QUERY_AAAA = 28, + + /** Force 'PTR' to use IPV4 scemantics */ + DNS_QUERY_PTR4 = 0xFFFD, + /** Force 'PTR' to use IPV6 scemantics */ + DNS_QUERY_PTR6 = 0xFFFE +}; + +/** * Result status, used internally */ class CoreExport DNSResult @@ -61,6 +83,9 @@ class CoreExport DNSResult /** The original request, a hostname or IP address */ std::string original; + /** The type of the request + */ + QueryType type; /** Build a DNS result. * @param i The request ID @@ -68,7 +93,7 @@ class CoreExport DNSResult * @param timetolive The request time-to-live * @param orig The original request, a hostname or IP */ - DNSResult(int i, const std::string &res, unsigned long timetolive, const std::string &orig) : id(i), result(res), ttl(timetolive), original(orig) { } + DNSResult(int i, const std::string &res, unsigned long timetolive, const std::string &orig, QueryType qt = DNS_QUERY_NONE) : id(i), result(res), ttl(timetolive), original(orig), type(qt) { } }; /** @@ -84,6 +109,9 @@ class CoreExport CachedQuery /** The cached result data, an IP or hostname */ std::string data; + /** The type of result this is + */ + QueryType type; /** The time when the item is due to expire */ time_t expires; @@ -92,7 +120,7 @@ class CoreExport CachedQuery * @param res The result data, an IP or hostname * @param ttl The time-to-live value of the query result */ - CachedQuery(const std::string &res, unsigned int ttl); + CachedQuery(const std::string &res, QueryType qt, unsigned int ttl); /** Returns the number of seconds remaining before this * cache item has expired and should be removed. @@ -118,28 +146,6 @@ enum ResolverError }; /** - * Query and resource record types - */ -enum QueryType -{ - /** Uninitialized Query */ - DNS_QUERY_NONE = 0, - /** 'A' record: an ipv4 address */ - DNS_QUERY_A = 1, - /** 'CNAME' record: An alias */ - DNS_QUERY_CNAME = 5, - /** 'PTR' record: a hostname */ - DNS_QUERY_PTR = 12, - /** 'AAAA' record: an ipv6 address */ - DNS_QUERY_AAAA = 28, - - /** Force 'PTR' to use IPV4 scemantics */ - DNS_QUERY_PTR4 = 0xFFFD, - /** Force 'PTR' to use IPV6 scemantics */ - DNS_QUERY_PTR6 = 0xFFFE -}; - -/** * Used internally to force PTR lookups to use a certain protocol scemantics, * e.g. x.x.x.x.in-addr.arpa for v4, and *.ip6.arpa for v6. */ diff --git a/src/dns.cpp b/src/dns.cpp index 63bde0ecc..8ad94e9e1 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -160,7 +160,7 @@ class RequestTimeout : public Timer } }; -CachedQuery::CachedQuery(const std::string &res, unsigned int ttl) : data(res) +CachedQuery::CachedQuery(const std::string &res, QueryType qt, unsigned int ttl) : data(res), type(qt) { expires = ServerInstance->Time() + ttl; } @@ -716,8 +716,9 @@ DNSResult DNS::GetResult() /* Build the reply with the id and hostname/ip in it */ std::string ro = req->orig; + DNSResult result = DNSResult(this_id,resultstr,ttl,ro,req->type); delete req; - return DNSResult(this_id,resultstr,ttl,ro); + return result; } } @@ -945,11 +946,12 @@ Resolver::Resolver(const std::string &source, QueryType qt, bool &cached, Module { ServerInstance->Res->DelCache(source); } - else + else if (CQ->type == qt) { cached = true; return; } + CQ = NULL; } switch (querytype) @@ -1054,7 +1056,7 @@ void DNS::HandleEvent(EventType, int) ServerInstance->stats->statsDnsGood++; if (!this->GetCache(res.original.c_str())) - this->cache->insert(std::make_pair(res.original.c_str(), CachedQuery(res.result, res.ttl))); + 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]; |