[Python-checkins] cpython (2.7): Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError

victor.stinner python-checkins at python.org
Sat Jul 26 14:54:55 CEST 2014


http://hg.python.org/cpython/rev/04c916a1e82f
changeset:   91881:04c916a1e82f
branch:      2.7
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sat Jul 26 14:52:55 2014 +0200
summary:
  Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError
on closed socket.

files:
  Lib/test/test_socket.py |  18 ++++++++++++++++++
  Misc/NEWS               |   3 +++
  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
--- 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
--- 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
--- 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);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list