diff options
-rw-r--r-- | Lib/test/test_socket.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/socketmodule.c | 10 |
3 files changed, 19 insertions, 2 deletions
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 66664b4..5c906d7 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -388,6 +388,14 @@ class GeneralModuleTests(unittest.TestCase): # 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 @@ -152,6 +152,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 #5203: Fixed ctypes segfaults when passing a unicode string to a function without argtypes (only occurs if HAVE_USABLE_WCHAR_T is false). diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index fc85bcc..9cefe04 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3769,8 +3769,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; @@ -5305,7 +5308,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; |