cpython: 74856df7e55b (original) (raw)
Mercurial > cpython
changeset 102318:74856df7e55b 3.5
Issue #23804: Fix SSL zero-length recv() calls to not block and raise EOF [#23804]
Martin Panter vadmium+py@gmail.com | |
---|---|
date | Mon, 11 Jul 2016 00:17:13 +0000 |
parents | f0a86a0d303a |
children | 4ef2404d343e bff61d3da57b |
files | Lib/test/test_ssl.py Misc/NEWS Modules/_ssl.c |
diffstat | 3 files changed, 32 insertions(+), 8 deletions(-)[+] [-] Lib/test/test_ssl.py 29 Misc/NEWS 3 Modules/_ssl.c 8 |
line wrap: on
line diff
--- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2793,20 +2793,13 @@ else: # consume data s.read()
# read(-1, buffer) is supported, even though read(-1) is not[](#l1.7) data = b"data"[](#l1.8)
# read(-1, buffer) is supported, even though read(-1) is not[](#l1.10) s.send(data)[](#l1.11) buffer = bytearray(len(data))[](#l1.12) self.assertEqual(s.read(-1, buffer), len(data))[](#l1.13) self.assertEqual(buffer, data)[](#l1.14)
# recv/read(0) should return no data[](#l1.16)
s.send(data)[](#l1.17)
self.assertEqual(s.recv(0), b"")[](#l1.18)
self.assertEqual(s.read(0), b"")[](#l1.19)
self.assertEqual(s.read(), data)[](#l1.20)
- # Make sure sendmsg et al are disallowed to avoid # inadvertent disclosure of data and/or corruption # of the encrypted data stream @@ -2822,6 +2815,26 @@ else: s.close()
def test_recv_zero(self):[](#l1.29)
server = ThreadedEchoServer(CERTFILE)[](#l1.30)
server.__enter__()[](#l1.31)
self.addCleanup(server.__exit__, None, None)[](#l1.32)
s = socket.create_connection((HOST, server.port))[](#l1.33)
self.addCleanup(s.close)[](#l1.34)
s = ssl.wrap_socket(s, suppress_ragged_eofs=False)[](#l1.35)
self.addCleanup(s.close)[](#l1.36)
# recv/read(0) should return no data[](#l1.38)
s.send(b"data")[](#l1.39)
self.assertEqual(s.recv(0), b"")[](#l1.40)
self.assertEqual(s.read(0), b"")[](#l1.41)
self.assertEqual(s.read(), b"data")[](#l1.42)
# Should not block if the other end sends no data[](#l1.44)
s.setblocking(False)[](#l1.45)
self.assertEqual(s.recv(0), b"")[](#l1.46)
self.assertEqual(s.recv_into(bytearray()), 0)[](#l1.47)
+ def test_nonblocking_send(self): server = ThreadedEchoServer(CERTFILE, certreqs=ssl.CERT_NONE,
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Core and Builtins Library ------- +- Issue #23804: Fix SSL zero-length recv() calls to not block and not raise
- Issue #27466: Change time format returned by http.cookie.time2netscape, confirming the netscape cookie format and making it consistent with documentation.
--- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1913,6 +1913,10 @@ static PyObject * dest = PyBytes_FromStringAndSize(NULL, len); if (dest == NULL) goto error;
if (len == 0) {[](#l3.7)
Py_XDECREF(sock);[](#l3.8)
return dest;[](#l3.9)
} else { @@ -1924,6 +1928,10 @@ static PyObject * "maximum length can't fit in a C 'int'"); goto error; }}[](#l3.10) mem = PyBytes_AS_STRING(dest);[](#l3.11)
if (len == 0) {[](#l3.18)
count = 0;[](#l3.19)
goto done;[](#l3.20)
}}[](#l3.21) }[](#l3.22)