From: Gregory P. Smith Date: Wed, 11 Feb 2009 23:45:25 +0000 (+0000) Subject: Issue #1008086: Fixes socket.inet_aton() to always return 4 bytes even X-Git-Tag: v2.7a1~2052 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3605b5cee3ae86e014c015242dd82e2f46ba5c5f;p=thirdparty%2FPython%2Fcpython.git Issue #1008086: Fixes socket.inet_aton() to always return 4 bytes even on LP64 platforms (most 64-bit Linux, bsd, unix systems). --- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 66664b44ed5b..5c906d776a70 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 diff --git a/Misc/NEWS b/Misc/NEWS index a8b5a3cbe7b2..530a55d38d1a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 fc85bcc894a9..9cefe045ce1a 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;