diff options
author | vandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-18 23:26:51 +0000 |
---|---|---|
committer | vandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-18 23:26:51 +0000 |
commit | de114d6a8a223904bc5988c36c22518dd59e1b3a (patch) | |
tree | c5f21c96501172b8dd9dc3a7871ae89fa16cacdc /net/base/address_list.cc | |
parent | 4067f4a5f0c7ace27a9631cfbf261e42e1ecc8e6 (diff) | |
download | chromium_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.cc | 91 |
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); |