| Index: third_party/libjingle/overrides/talk/base/win32.cc | 
| =================================================================== | 
| --- third_party/libjingle/overrides/talk/base/win32.cc	(revision 124320) | 
| +++ third_party/libjingle/overrides/talk/base/win32.cc	(working copy) | 
| @@ -63,10 +63,7 @@ | 
| return NULL; | 
| } | 
|  | 
| -// As above, but for inet_pton. Wraps inet_addr for v4, and implements inet_pton | 
| -// for v6. Slightly more permissive than the RFC specified inet_pton, as it uses | 
| -// windows' inet_addr which permits octal and hexadecimal values in v4 | 
| -// addresses, while inet_pton only allows decimal. | 
| +// As above, but for inet_pton. Implements inet_pton for v4 and v6. | 
| // Note that our inet_ntop will output normal 'dotted' v4 addresses only. | 
| int win32_inet_pton(int af, const char* src, void* dst) { | 
| if (!src || !dst) { | 
| @@ -172,14 +169,45 @@ | 
| } | 
|  | 
| // Helper function for inet_pton for IPv4 addresses. | 
| -// Uses win32's inet_addr. | 
| +// |src| points to a character string containing an IPv4 network address in | 
| +// dotted-decimal format, "ddd.ddd.ddd.ddd", where ddd is a decimal number | 
| +// of up to three digits in the range 0 to 255. | 
| +// The address is converted and copied to dst, | 
| +// which must be sizeof(struct in_addr) (4) bytes (32 bits) long. | 
| int inet_pton_v4(const char* src, void* dst) { | 
| -  uint32 ip = inet_addr(src); | 
| -  if (ip == 0xFFFFFFFF && strcmp(src, "255.255.255.255") != 0) { | 
| +  const int kIpv4AddressSize = 4; | 
| +  int num_dot = 0; | 
| +  const char* src_pos = src; | 
| +  unsigned char result[kIpv4AddressSize] = {0}; | 
| + | 
| +  while (*src_pos != 0) { | 
| +    // strtol won't treat whitespace characters in the begining as an error, | 
| +    // so check to ensure this is started with digit before passing to strtol. | 
| +    if (!isdigit(*src_pos)) { | 
| +      return 0; | 
| +    } | 
| +    char* end_pos; | 
| +    long int value = strtol(src_pos, &end_pos, 10); | 
| +    if (value < 0 || value > 255 || src_pos == end_pos) { | 
| +      return 0; | 
| +    } | 
| +    result[num_dot] = value; | 
| +    if (*end_pos == 0) { | 
| +      break; | 
| +    } | 
| +    src_pos = end_pos; | 
| +    if (*src_pos == '.') { | 
| +      ++num_dot; | 
| +      if (num_dot > kIpv4AddressSize - 1) { | 
| +        return 0; | 
| +      } | 
| +    } | 
| +    ++src_pos; | 
| +  } | 
| +  if (num_dot != kIpv4AddressSize - 1) { | 
| return 0; | 
| } | 
| -  struct in_addr* dst_as_in_addr = reinterpret_cast<struct in_addr*>(dst); | 
| -  dst_as_in_addr->s_addr = ip; | 
| +  memcpy(dst, result, sizeof(result)); | 
| return 1; | 
| } | 
|  | 
|  |