| Index: net/base/address_list.cc
|
| diff --git a/net/base/address_list.cc b/net/base/address_list.cc
|
| index cf7f0d5c8da6514e69d73702295ab9cf54afee19..1736a193ddc7329036eafbdfe71a4ff938b9ba38 100644
|
| --- a/net/base/address_list.cc
|
| +++ b/net/base/address_list.cc
|
| @@ -13,6 +13,14 @@ namespace net {
|
|
|
| namespace {
|
|
|
| +char* do_strdup(const char* src) {
|
| +#if defined(OS_WIN)
|
| + return _strdup(src);
|
| +#else
|
| + return strdup(src);
|
| +#endif
|
| +}
|
| +
|
| // Make a copy of |info| (the dynamically-allocated parts are copied as well).
|
| // If |recursive| is true, chained entries via ai_next are copied too.
|
| // Copy returned by this function should be deleted using
|
| @@ -27,11 +35,7 @@ struct addrinfo* CreateCopyOfAddrinfo(const struct addrinfo* info,
|
|
|
| // ai_canonname is a NULL-terminated string.
|
| if (info->ai_canonname) {
|
| -#ifdef OS_WIN
|
| - copy->ai_canonname = _strdup(info->ai_canonname);
|
| -#else
|
| - copy->ai_canonname = strdup(info->ai_canonname);
|
| -#endif
|
| + copy->ai_canonname = do_strdup(info->ai_canonname);
|
| }
|
|
|
| // ai_addr is a buffer of length ai_addrlen.
|
| @@ -162,21 +166,45 @@ void AddressList::Reset() {
|
| }
|
|
|
| // static
|
| -AddressList AddressList::CreateIPv6Address(unsigned char data[16]) {
|
| +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;
|
| - ai->ai_addrlen = sizeof(struct sockaddr_in6);
|
| + 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[ai->ai_addrlen]);
|
| - memset(addr6, 0, sizeof(struct sockaddr_in6));
|
| -
|
| - ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6);
|
| + 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*/));
|
| }
|
|
|