Index: net/base/dnsrr_resolver.cc |
diff --git a/net/base/dnsrr_resolver.cc b/net/base/dnsrr_resolver.cc |
index b07df697693818fd6525c05bea1a36371d5416eb..454a9fe7d685c056e95d8cec4a94d32c4a2ae002 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)) { |