OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/dns/dns_response.h" | 5 #include "net/dns/dns_response.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/big_endian.h" | 9 #include "base/big_endian.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
11 #include "base/sys_byteorder.h" | 11 #include "base/sys_byteorder.h" |
12 #include "net/base/address_list.h" | 12 #include "net/base/address_list.h" |
13 #include "net/base/io_buffer.h" | 13 #include "net/base/io_buffer.h" |
| 14 #include "net/base/ip_address.h" |
14 #include "net/base/net_errors.h" | 15 #include "net/base/net_errors.h" |
15 #include "net/dns/dns_protocol.h" | 16 #include "net/dns/dns_protocol.h" |
16 #include "net/dns/dns_query.h" | 17 #include "net/dns/dns_query.h" |
17 #include "net/dns/dns_util.h" | 18 #include "net/dns/dns_util.h" |
18 | 19 |
19 namespace net { | 20 namespace net { |
20 | 21 |
21 DnsResourceRecord::DnsResourceRecord() { | 22 DnsResourceRecord::DnsResourceRecord() { |
22 } | 23 } |
23 | 24 |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 // we can always fall back to the system getaddrinfo. | 284 // we can always fall back to the system getaddrinfo. |
284 | 285 |
285 // Expected owner of record. No trailing dot. | 286 // Expected owner of record. No trailing dot. |
286 std::string expected_name = GetDottedName(); | 287 std::string expected_name = GetDottedName(); |
287 | 288 |
288 uint16_t expected_type = qtype(); | 289 uint16_t expected_type = qtype(); |
289 DCHECK(expected_type == dns_protocol::kTypeA || | 290 DCHECK(expected_type == dns_protocol::kTypeA || |
290 expected_type == dns_protocol::kTypeAAAA); | 291 expected_type == dns_protocol::kTypeAAAA); |
291 | 292 |
292 size_t expected_size = (expected_type == dns_protocol::kTypeAAAA) | 293 size_t expected_size = (expected_type == dns_protocol::kTypeAAAA) |
293 ? kIPv6AddressSize : kIPv4AddressSize; | 294 ? IPAddress::kIPv6AddressSize |
| 295 : IPAddress::kIPv4AddressSize; |
294 | 296 |
295 uint32_t ttl_sec = std::numeric_limits<uint32_t>::max(); | 297 uint32_t ttl_sec = std::numeric_limits<uint32_t>::max(); |
296 IPAddressList ip_addresses; | 298 IPAddressList ip_addresses; |
297 DnsRecordParser parser = Parser(); | 299 DnsRecordParser parser = Parser(); |
298 DnsResourceRecord record; | 300 DnsResourceRecord record; |
299 unsigned ancount = answer_count(); | 301 unsigned ancount = answer_count(); |
300 for (unsigned i = 0; i < ancount; ++i) { | 302 for (unsigned i = 0; i < ancount; ++i) { |
301 if (!parser.ReadRecord(&record)) | 303 if (!parser.ReadRecord(&record)) |
302 return DNS_MALFORMED_RESPONSE; | 304 return DNS_MALFORMED_RESPONSE; |
303 | 305 |
(...skipping 11 matching lines...) Expand all Loading... |
315 | 317 |
316 ttl_sec = std::min(ttl_sec, record.ttl); | 318 ttl_sec = std::min(ttl_sec, record.ttl); |
317 } else if (record.type == expected_type) { | 319 } else if (record.type == expected_type) { |
318 if (record.rdata.size() != expected_size) | 320 if (record.rdata.size() != expected_size) |
319 return DNS_SIZE_MISMATCH; | 321 return DNS_SIZE_MISMATCH; |
320 | 322 |
321 if (!base::EqualsCaseInsensitiveASCII(record.name, expected_name)) | 323 if (!base::EqualsCaseInsensitiveASCII(record.name, expected_name)) |
322 return DNS_NAME_MISMATCH; | 324 return DNS_NAME_MISMATCH; |
323 | 325 |
324 ttl_sec = std::min(ttl_sec, record.ttl); | 326 ttl_sec = std::min(ttl_sec, record.ttl); |
325 ip_addresses.push_back(IPAddressNumber(record.rdata.begin(), | 327 ip_addresses.push_back( |
326 record.rdata.end())); | 328 IPAddress(reinterpret_cast<const uint8_t*>(record.rdata.data()), |
| 329 record.rdata.length())); |
327 } | 330 } |
328 } | 331 } |
329 | 332 |
330 // TODO(szym): Extract TTL for NODATA results. http://crbug.com/115051 | 333 // TODO(szym): Extract TTL for NODATA results. http://crbug.com/115051 |
331 | 334 |
332 // getcanonname in eglibc returns the first owner name of an A or AAAA RR. | 335 // getcanonname in eglibc returns the first owner name of an A or AAAA RR. |
333 // If the response passed all the checks so far, then |expected_name| is it. | 336 // If the response passed all the checks so far, then |expected_name| is it. |
334 *addr_list = AddressList::CreateFromIPAddressList(ip_addresses, | 337 *addr_list = AddressList::CreateFromIPAddressList(ip_addresses, |
335 expected_name); | 338 expected_name); |
336 *ttl = base::TimeDelta::FromSeconds(ttl_sec); | 339 *ttl = base::TimeDelta::FromSeconds(ttl_sec); |
337 return DNS_PARSE_OK; | 340 return DNS_PARSE_OK; |
338 } | 341 } |
339 | 342 |
340 } // namespace net | 343 } // namespace net |
OLD | NEW |