| 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)) {
|
|
|