Kaydet (Commit) e254e53c authored tarafından Victor Stinner's avatar Victor Stinner

Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError

on closed socket. repr(socket.socket) already works fine.
üst 51e44ea6
...@@ -38,6 +38,11 @@ try: ...@@ -38,6 +38,11 @@ try:
except ImportError: except ImportError:
thread = None thread = None
threading = None threading = None
try:
import _socket
except ImportError:
_socket = None
def _have_socket_can(): def _have_socket_can():
"""Check whether CAN sockets are supported on this host.""" """Check whether CAN sockets are supported on this host."""
...@@ -658,6 +663,19 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -658,6 +663,19 @@ class GeneralModuleTests(unittest.TestCase):
self.assertIn('[closed]', repr(s)) self.assertIn('[closed]', repr(s))
self.assertNotIn('laddr', 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): def test_weakref(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
p = proxy(s) p = proxy(s)
......
...@@ -27,6 +27,9 @@ Core and Builtins ...@@ -27,6 +27,9 @@ Core and Builtins
Library Library
------- -------
- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError
on closed socket. repr(socket.socket) already works fine.
- Issue #16133: The asynchat.async_chat.handle_read() method now ignores - Issue #16133: The asynchat.async_chat.handle_read() method now ignores
BlockingIOError exceptions. BlockingIOError exceptions.
......
...@@ -3868,8 +3868,13 @@ sock_dealloc(PySocketSockObject *s) ...@@ -3868,8 +3868,13 @@ sock_dealloc(PySocketSockObject *s)
static PyObject * static PyObject *
sock_repr(PySocketSockObject *s) 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 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 /* this can occur on Win64, and actually there is a special
ugly printf formatter for decimal pointer length integer ugly printf formatter for decimal pointer length integer
printing, only bother if necessary*/ printing, only bother if necessary*/
...@@ -3879,9 +3884,11 @@ sock_repr(PySocketSockObject *s) ...@@ -3879,9 +3884,11 @@ sock_repr(PySocketSockObject *s)
return NULL; return NULL;
} }
#endif #endif
else
sock_fd = (long)s->sock_fd;
return PyUnicode_FromFormat( return PyUnicode_FromFormat(
"<socket object, fd=%ld, family=%d, type=%d, proto=%d>", "<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_type,
s->sock_proto); s->sock_proto);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment