diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index dabdcfe9d510..7380e3ef3d67 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -385,6 +385,14 @@ def testDefaultTimeout(self): # Check that setting it to an invalid type raises TypeError self.assertRaises(TypeError, socket.setdefaulttimeout, "spam") + def testIPv4_inet_aton_fourbytes(self): + if not hasattr(socket, 'inet_aton'): + return # No inet_aton, nothing to check + # Test that issue1008086 and issue767150 are fixed. + # It must return 4 bytes. + self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0')) + self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255')) + def testIPv4toString(self): if not hasattr(socket, 'inet_pton'): return # No inet_pton() on this platform diff --git a/Misc/NEWS b/Misc/NEWS index caec215b7d45..0b2bd7db290c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -24,6 +24,9 @@ Core and Builtins Library ------- +- Issue #1008086: Fixed socket.inet_aton() to always return 4 bytes even on + LP64 platforms (most 64-bit Linux, bsd, unix systems). + - Issue #7246 & Issue #7208: getpass now properly flushes input before reading from stdin so that existing input does not confuse it and lead to incorrect entry or an IOError. It also properly flushes it diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 9591c12029b4..b1b7141d2f2f 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3745,8 +3745,11 @@ socket_inet_aton(PyObject *self, PyObject *args) #endif #if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK) +#if (SIZEOF_INT != 4) +#error "Not sure if in_addr_t exists and int is not 32-bits." +#endif /* Have to use inet_addr() instead */ - unsigned long packed_addr; + unsigned int packed_addr; #endif char *ip_addr; @@ -5284,7 +5287,10 @@ int inet_pton(int af, const char *src, void *dst) { if (af == AF_INET) { - long packed_addr; +#if (SIZEOF_INT != 4) +#error "Not sure if in_addr_t exists and int is not 32-bits." +#endif + unsigned int packed_addr; packed_addr = inet_addr(src); if (packed_addr == INADDR_NONE) return 0;