summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-09-08 16:58:50 -0400
committerAdam <Adam@anope.org>2014-09-08 18:19:00 -0400
commitdf67ab549bcc2cd53519f309110c58c00f2c935b (patch)
tree39bccb74584d359ef8540c3ee6df44dc34093d20
parent8125a187b17f41a199cc4ebaa99f4d616e930049 (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.h54
-rw-r--r--src/dns.cpp10
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];