diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-07-26 14:37:57 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-07-26 14:37:57 +0200 |
commit | 011428e168fcbc75c6e2ee3fbaf511bc64f65501 (patch) | |
tree | 5f5a60bd2b7390d29fdec68e343d3946e9e5c36a | |
parent | af529035abb81f7225c75b3def34fe727ff78f29 (diff) | |
parent | e254e53c833d39e1e479a16d7976a7726c0c1981 (diff) | |
download | cpython-git-011428e168fcbc75c6e2ee3fbaf511bc64f65501.tar.gz |
(Merge 3.4) Fix repr(_socket.socket) on Windows 64-bit: don't fail with
OverflowError on closed socket. repr(socket.socket) already works fine.
-rw-r--r-- | Lib/test/test_socket.py | 18 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/socketmodule.c | 11 |
3 files changed, 30 insertions, 2 deletions
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index e9043faea7..98ee615065 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -40,6 +40,11 @@ try: except ImportError: thread = None threading = None +try: + import _socket +except ImportError: + _socket = None + def _have_socket_can(): """Check whether CAN sockets are supported on this host.""" @@ -660,6 +665,19 @@ class GeneralModuleTests(unittest.TestCase): self.assertIn('[closed]', repr(s)) self.assertNotIn('laddr', repr(s)) + @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 = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>' + % (s.fileno(), s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + finally: + s.close() + expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>' + % (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) @@ -108,6 +108,9 @@ Core and Builtins Library ------- +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. repr(socket.socket) already works fine. + - Issue #22033: Reprs of most Python implemened classes now contain actual class name instead of hardcoded one. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f510f0e214..bb37dd60e1 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3869,8 +3869,13 @@ sock_dealloc(PySocketSockObject *s) static PyObject * sock_repr(PySocketSockObject *s) { + 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*/ @@ -3880,9 +3885,11 @@ sock_repr(PySocketSockObject *s) return NULL; } #endif + else + sock_fd = (long)s->sock_fd; return PyUnicode_FromFormat( "<socket object, fd=%ld, family=%d, type=%d, proto=%d>", - (long)s->sock_fd, s->sock_family, + sock_fd, s->sock_family, s->sock_type, s->sock_proto); } |