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 28fd378..81bd537 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -15,6 +15,11 @@
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 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 = ('<socket object, fd=%s, family=%s, type=%s, protocol=%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, protocol=%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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 01f4c17..f2087c5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@
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 130b6b3..0127a6c 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3123,8 +3123,13 @@
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 @@
return NULL;
}
#endif
+ else
+ sock_fd = (long)s->sock_fd;
PyOS_snprintf(
buf, sizeof(buf),
"<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
- (long)s->sock_fd, s->sock_family,
+ sock_fd, s->sock_family,
s->sock_type,
s->sock_proto);
return PyString_FromString(buf);