summaryrefslogtreecommitdiffstats
path: root/net/base/dnsrr_resolver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/dnsrr_resolver.cc')
-rw-r--r--net/base/dnsrr_resolver.cc138
1 files changed, 1 insertions, 137 deletions
diff --git a/net/base/dnsrr_resolver.cc b/net/base/dnsrr_resolver.cc
index b07df69..454a9fe 100644
--- a/net/base/dnsrr_resolver.cc
+++ b/net/base/dnsrr_resolver.cc
@@ -400,142 +400,6 @@ class RRResolverWorker {
DISALLOW_COPY_AND_ASSIGN(RRResolverWorker);
};
-
-// A Buffer is used for walking over a DNS packet.
-class Buffer {
- public:
- Buffer(const uint8* p, unsigned len)
- : p_(p),
- packet_(p),
- len_(len),
- packet_len_(len) {
- }
-
- bool U8(uint8* v) {
- if (len_ < 1)
- return false;
- *v = *p_;
- p_++;
- len_--;
- return true;
- }
-
- bool U16(uint16* v) {
- if (len_ < 2)
- return false;
- *v = static_cast<uint16>(p_[0]) << 8 |
- static_cast<uint16>(p_[1]);
- p_ += 2;
- len_ -= 2;
- return true;
- }
-
- bool U32(uint32* v) {
- if (len_ < 4)
- return false;
- *v = static_cast<uint32>(p_[0]) << 24 |
- static_cast<uint32>(p_[1]) << 16 |
- static_cast<uint32>(p_[2]) << 8 |
- static_cast<uint32>(p_[3]);
- p_ += 4;
- len_ -= 4;
- return true;
- }
-
- bool Skip(unsigned n) {
- if (len_ < n)
- return false;
- p_ += n;
- len_ -= n;
- return true;
- }
-
- bool Block(base::StringPiece* out, unsigned len) {
- if (len_ < len)
- return false;
- *out = base::StringPiece(reinterpret_cast<const char*>(p_), len);
- p_ += len;
- len_ -= len;
- return true;
- }
-
- // DNSName parses a (possibly compressed) DNS name from the packet. If |name|
- // is not NULL, then the name is written into it. See RFC 1035 section 4.1.4.
- bool DNSName(std::string* name) {
- unsigned jumps = 0;
- const uint8* p = p_;
- unsigned len = len_;
-
- if (name)
- name->clear();
-
- for (;;) {
- if (len < 1)
- return false;
- uint8 d = *p;
- p++;
- len--;
-
- // The two couple of bits of the length give the type of the length. It's
- // either a direct length or a pointer to the remainder of the name.
- if ((d & 0xc0) == 0xc0) {
- // This limit matches the depth limit in djbdns.
- if (jumps > 100)
- return false;
- if (len < 1)
- return false;
- uint16 offset = static_cast<uint16>(d) << 8 |
- static_cast<uint16>(p[0]);
- offset &= 0x3ff;
- p++;
- len--;
-
- if (jumps == 0) {
- p_ = p;
- len_ = len;
- }
- jumps++;
-
- if (offset >= packet_len_)
- return false;
- p = &packet_[offset];
- len = packet_len_ - offset;
- } else if ((d & 0xc0) == 0) {
- uint8 label_len = d;
- if (len < label_len)
- return false;
- if (name && label_len) {
- if (!name->empty())
- name->append(".");
- name->append(reinterpret_cast<const char*>(p), label_len);
- }
- p += label_len;
- len -= label_len;
-
- if (jumps == 0) {
- p_ = p;
- len_ = len;
- }
-
- if (label_len == 0)
- break;
- } else {
- return false;
- }
- }
-
- return true;
- }
-
- private:
- const uint8* p_;
- const uint8* const packet_;
- unsigned len_;
- const unsigned packet_len_;
-
- DISALLOW_COPY_AND_ASSIGN(Buffer);
-};
-
bool RRResponse::HasExpired(const base::Time current_time) const {
const base::TimeDelta delta(base::TimeDelta::FromSeconds(ttl));
const base::Time expiry = fetch_time + delta;
@@ -554,7 +418,7 @@ bool RRResponse::ParseFromResponse(const uint8* p, unsigned len,
// RFC 1035 section 4.4.1
uint8 flags2;
- Buffer buf(p, len);
+ DnsResponseBuffer buf(p, len);
if (!buf.Skip(2) || // skip id
!buf.Skip(1) || // skip first flags byte
!buf.U8(&flags2)) {