summaryrefslogtreecommitdiffstats
path: root/net/base/address_list.cc
diff options
context:
space:
mode:
authorvandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-18 23:26:51 +0000
committervandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-18 23:26:51 +0000
commitde114d6a8a223904bc5988c36c22518dd59e1b3a (patch)
treec5f21c96501172b8dd9dc3a7871ae89fa16cacdc /net/base/address_list.cc
parent4067f4a5f0c7ace27a9631cfbf261e42e1ecc8e6 (diff)
downloadchromium_src-de114d6a8a223904bc5988c36c22518dd59e1b3a.zip
chromium_src-de114d6a8a223904bc5988c36c22518dd59e1b3a.tar.gz
chromium_src-de114d6a8a223904bc5988c36c22518dd59e1b3a.tar.bz2
Don't resolve IP literals.
For each resolution request this checks to see if this 'host' is a literal ip address. If so, it synthesises a struct addrinfo and returns it without adding it to the cache. BUG=39830 TEST=unit tests, new and old Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=56384 Review URL: http://codereview.chromium.org/3023048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56615 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/address_list.cc')
-rw-r--r--net/base/address_list.cc91
1 files changed, 47 insertions, 44 deletions
diff --git a/net/base/address_list.cc b/net/base/address_list.cc
index 1c97311..75c30b8 100644
--- a/net/base/address_list.cc
+++ b/net/base/address_list.cc
@@ -85,6 +85,53 @@ void SetPortRecursive(struct addrinfo* info, int port) {
} // namespace
+AddressList::AddressList(const IPAddressNumber& address, int port,
+ bool canonicalize_name) {
+ struct addrinfo* ai = new addrinfo;
+ memset(ai, 0, sizeof(addrinfo));
+ ai->ai_socktype = SOCK_STREAM;
+
+ switch (address.size()) {
+ case 4: {
+ ai->ai_family = AF_INET;
+ const size_t sockaddr_in_size = sizeof(struct sockaddr_in);
+ ai->ai_addrlen = sockaddr_in_size;
+
+ struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(
+ new char[sockaddr_in_size]);
+ memset(addr, 0, sockaddr_in_size);
+ addr->sin_family = AF_INET;
+ memcpy(&addr->sin_addr, &address[0], 4);
+ ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr);
+ break;
+ }
+ case 16: {
+ ai->ai_family = AF_INET6;
+ const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6);
+ ai->ai_addrlen = sockaddr_in6_size;
+
+ struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>(
+ new char[sockaddr_in6_size]);
+ memset(addr6, 0, sockaddr_in6_size);
+ addr6->sin6_family = AF_INET6;
+ memcpy(&addr6->sin6_addr, &address[0], 16);
+ ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6);
+ break;
+ }
+ default: {
+ NOTREACHED() << "Bad IP address";
+ break;
+ }
+ }
+
+ if (canonicalize_name) {
+ std::string name = NetAddressToString(ai);
+ ai->ai_canonname = do_strdup(name.c_str());
+ }
+ data_ = new Data(ai, false /*is_system_created*/);
+ SetPort(port);
+}
+
void AddressList::Adopt(struct addrinfo* head) {
data_ = new Data(head, true /*is_system_created*/);
}
@@ -143,50 +190,6 @@ void AddressList::Reset() {
data_ = NULL;
}
-// static
-AddressList AddressList::CreateIPv4Address(unsigned char data[4],
- const std::string& canonical_name) {
- struct addrinfo* ai = new addrinfo;
- memset(ai, 0, sizeof(addrinfo));
- ai->ai_family = AF_INET;
- ai->ai_socktype = SOCK_STREAM;
- const size_t sockaddr_in_size = sizeof(struct sockaddr_in);
- ai->ai_addrlen = sockaddr_in_size;
- if (!canonical_name.empty())
- ai->ai_canonname = do_strdup(canonical_name.c_str());
-
- struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(
- new char[sockaddr_in_size]);
- memset(addr, 0, sockaddr_in_size);
- addr->sin_family = AF_INET;
- memcpy(&addr->sin_addr, data, 4);
- ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr);
-
- return AddressList(new Data(ai, false /*is_system_created*/));
-}
-
-// static
-AddressList AddressList::CreateIPv6Address(unsigned char data[16],
- const std::string& canonical_name) {
- struct addrinfo* ai = new addrinfo;
- memset(ai, 0, sizeof(addrinfo));
- ai->ai_family = AF_INET6;
- ai->ai_socktype = SOCK_STREAM;
- const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6);
- ai->ai_addrlen = sockaddr_in6_size;
- if (!canonical_name.empty())
- ai->ai_canonname = do_strdup(canonical_name.c_str());
-
- struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>(
- new char[sockaddr_in6_size]);
- memset(addr6, 0, sockaddr_in6_size);
- addr6->sin6_family = AF_INET6;
- memcpy(&addr6->sin6_addr, data, 16);
- ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6);
-
- return AddressList(new Data(ai, false /*is_system_created*/));
-}
-
AddressList::Data::Data(struct addrinfo* ai, bool is_system_created)
: head(ai), is_system_created(is_system_created) {
DCHECK(head);