mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
(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.
This commit is contained in:
commit
011428e168
3 changed files with 30 additions and 2 deletions
|
@ -40,6 +40,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."""
|
||||||
|
@ -660,6 +665,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)
|
||||||
|
|
|
@ -108,6 +108,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 #22033: Reprs of most Python implemened classes now contain actual
|
- Issue #22033: Reprs of most Python implemened classes now contain actual
|
||||||
class name instead of hardcoded one.
|
class name instead of hardcoded one.
|
||||||
|
|
||||||
|
|
|
@ -3869,8 +3869,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*/
|
||||||
|
@ -3880,9 +3885,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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue