From: Victor Stinner Date: Sat, 26 Jul 2014 12:52:55 +0000 (+0200) Subject: Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a649c7bb1bdc6238963decc5b77ad805e551a9e;p=python Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. --- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 28fd37813f..81bd537e0e 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -15,6 +15,11 @@ import contextlib from weakref import proxy import signal import math +try: + import _socket +except ImportError: + _socket = None + def try_address(host, port=0, family=socket.AF_INET): """Try to bind a socket on the given host:port and return True @@ -244,6 +249,19 @@ class SocketPairTest(unittest.TestCase, ThreadableTest): class GeneralModuleTests(unittest.TestCase): + @unittest.skipUnless(_socket is not None, 'need _socket module') + def test_csocket_repr(self): + s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) + try: + expected = ('' + % (s.fileno(), s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + finally: + s.close() + expected = ('' + % (s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + def test_weakref(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) p = proxy(s) diff --git a/Misc/NEWS b/Misc/NEWS index 01f4c17304..f2087c5c5c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Core and Builtins Library ------- +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. + - Issue #16133: The asynchat.async_chat.handle_read() method now ignores socket.error() exceptions with blocking I/O errors: EAGAIN, EALREADY, EINPROGRESS, or EWOULDBLOCK. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 130b6b3c8c..0127a6c3c6 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3123,8 +3123,13 @@ static PyObject * sock_repr(PySocketSockObject *s) { char buf[512]; + long sock_fd; + /* On Windows, this test is needed because SOCKET_T is unsigned */ + if (s->sock_fd == INVALID_SOCKET) { + sock_fd = -1; + } #if SIZEOF_SOCKET_T > SIZEOF_LONG - if (s->sock_fd > LONG_MAX) { + else if (s->sock_fd > LONG_MAX) { /* this can occur on Win64, and actually there is a special ugly printf formatter for decimal pointer length integer printing, only bother if necessary*/ @@ -3134,10 +3139,12 @@ sock_repr(PySocketSockObject *s) return NULL; } #endif + else + sock_fd = (long)s->sock_fd; PyOS_snprintf( buf, sizeof(buf), "", - (long)s->sock_fd, s->sock_family, + sock_fd, s->sock_family, s->sock_type, s->sock_proto); return PyString_FromString(buf);