Index: net/base/dns_response.cc |
diff --git a/net/base/dns_response.cc b/net/base/dns_response.cc |
index 9cfbae221225d09911e6d509a216fc6230887ccf..31dfac38a5dc2570775553df76667ad05d0c3da2 100644 |
--- a/net/base/dns_response.cc |
+++ b/net/base/dns_response.cc |
@@ -4,7 +4,6 @@ |
#include "net/base/dns_response.h" |
-#include "net/base/address_list.h" |
#include "net/base/dns_util.h" |
#include "net/base/net_errors.h" |
@@ -18,15 +17,12 @@ DnsResponse::DnsResponse(DnsQuery* query) |
: query_(query), |
io_buffer_(new IOBufferWithSize(kMaxResponseSize + 1)) { |
DCHECK(query_); |
- DCHECK(query_->IsValid()); |
} |
DnsResponse::~DnsResponse() { |
} |
-int DnsResponse::Parse(int nbytes, AddressList* results) { |
- DCHECK(query_->IsValid()); |
- |
+int DnsResponse::Parse(int nbytes, std::vector<IPAddressNumber>* ip_addresses) { |
// Response includes query, it should be at least that size. |
if (nbytes < query_->io_buffer()->size() || nbytes > kMaxResponseSize) |
return ERR_DNS_MALFORMED_RESPONSE; |
@@ -59,14 +55,10 @@ int DnsResponse::Parse(int nbytes, AddressList* results) { |
if (query_count != 1) // Sent a single question, shouldn't have changed. |
return ERR_DNS_MALFORMED_RESPONSE; |
- std::string hostname; |
- uint16 qtype, qclass; |
- if (!response.DNSName(&hostname) || |
- !response.U16(&qtype) || |
- !response.U16(&qclass) || |
- hostname != query_->hostname() || // Make sure Question section |
- qtype != query_->qtype() || // echoed back. |
- qclass != kClassIN) { |
+ base::StringPiece question; // Make sure question section is echoed back. |
+ if (!response.Block(&question, query_->question_size()) || |
+ memcmp(question.data(), query_->question_data(), |
+ query_->question_size())) { |
return ERR_DNS_MALFORMED_RESPONSE; |
} |
@@ -76,7 +68,7 @@ int DnsResponse::Parse(int nbytes, AddressList* results) { |
std::vector<IPAddressNumber> rdatas; |
while (answer_count--) { |
uint32 ttl; |
- uint16 rdlength; |
+ uint16 rdlength, qtype, qclass; |
if (!response.DNSName(NULL) || |
!response.U16(&qtype) || |
!response.U16(&qclass) || |
@@ -84,7 +76,6 @@ int DnsResponse::Parse(int nbytes, AddressList* results) { |
!response.U16(&rdlength)) { |
return ERR_DNS_MALFORMED_RESPONSE; |
} |
- |
if (qtype == query_->qtype() && |
qclass == kClassIN && |
(rdlength == kIPv4AddressSize || rdlength == kIPv6AddressSize)) { |
@@ -99,7 +90,8 @@ int DnsResponse::Parse(int nbytes, AddressList* results) { |
if (rdatas.empty()) |
return ERR_NAME_NOT_RESOLVED; |
- *results = AddressList::CreateFromIPAddressList(rdatas, query_->port()); |
+ if (ip_addresses) |
+ ip_addresses->swap(rdatas); |
return OK; |
} |