Skip to content

Commit 7386268

Browse files
committed
Issue python#23804: Merge SSL recv() fix from 3.5
2 parents 4bf9c51 + bed7f1a commit 7386268

3 files changed

Lines changed: 32 additions & 8 deletions

File tree

Lib/test/test_ssl.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,20 +2788,13 @@ def _recvfrom_into():
27882788
# consume data
27892789
s.read()
27902790

2791-
data = b"data"
2792-
27932791
# read(-1, buffer) is supported, even though read(-1) is not
2792+
data = b"data"
27942793
s.send(data)
27952794
buffer = bytearray(len(data))
27962795
self.assertEqual(s.read(-1, buffer), len(data))
27972796
self.assertEqual(buffer, data)
27982797

2799-
# recv/read(0) should return no data
2800-
s.send(data)
2801-
self.assertEqual(s.recv(0), b"")
2802-
self.assertEqual(s.read(0), b"")
2803-
self.assertEqual(s.read(), data)
2804-
28052798
# Make sure sendmsg et al are disallowed to avoid
28062799
# inadvertent disclosure of data and/or corruption
28072800
# of the encrypted data stream
@@ -2817,6 +2810,26 @@ def _recvfrom_into():
28172810

28182811
s.close()
28192812

2813+
def test_recv_zero(self):
2814+
server = ThreadedEchoServer(CERTFILE)
2815+
server.__enter__()
2816+
self.addCleanup(server.__exit__, None, None)
2817+
s = socket.create_connection((HOST, server.port))
2818+
self.addCleanup(s.close)
2819+
s = ssl.wrap_socket(s, suppress_ragged_eofs=False)
2820+
self.addCleanup(s.close)
2821+
2822+
# recv/read(0) should return no data
2823+
s.send(b"data")
2824+
self.assertEqual(s.recv(0), b"")
2825+
self.assertEqual(s.read(0), b"")
2826+
self.assertEqual(s.read(), b"data")
2827+
2828+
# Should not block if the other end sends no data
2829+
s.setblocking(False)
2830+
self.assertEqual(s.recv(0), b"")
2831+
self.assertEqual(s.recv_into(bytearray()), 0)
2832+
28202833
def test_nonblocking_send(self):
28212834
server = ThreadedEchoServer(CERTFILE,
28222835
certreqs=ssl.CERT_NONE,

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ Core and Builtins
2727
Library
2828
-------
2929

30+
- Issue #23804: Fix SSL zero-length recv() calls to not block and not raise
31+
an error about unclean EOF.
32+
3033
- Issue #27466: Change time format returned by http.cookie.time2netscape,
3134
confirming the netscape cookie format and making it consistent with
3235
documentation.

Modules/_ssl.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,6 +1913,10 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
19131913
dest = PyBytes_FromStringAndSize(NULL, len);
19141914
if (dest == NULL)
19151915
goto error;
1916+
if (len == 0) {
1917+
Py_XDECREF(sock);
1918+
return dest;
1919+
}
19161920
mem = PyBytes_AS_STRING(dest);
19171921
}
19181922
else {
@@ -1924,6 +1928,10 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
19241928
"maximum length can't fit in a C 'int'");
19251929
goto error;
19261930
}
1931+
if (len == 0) {
1932+
count = 0;
1933+
goto done;
1934+
}
19271935
}
19281936
}
19291937

0 commit comments

Comments
 (0)