summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-07-26 14:37:57 +0200
committerVictor Stinner <victor.stinner@gmail.com>2014-07-26 14:37:57 +0200
commit011428e168fcbc75c6e2ee3fbaf511bc64f65501 (patch)
tree5f5a60bd2b7390d29fdec68e343d3946e9e5c36a
parentaf529035abb81f7225c75b3def34fe727ff78f29 (diff)
parente254e53c833d39e1e479a16d7976a7726c0c1981 (diff)
downloadcpython-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.py18
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/socketmodule.c11
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index b120f70fd9..c510a1a582 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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);
}