Skip to content

Commit cb95787

Browse files
committed
Revert "bpo-42854: Use SSL_read/write_ex() (pythonGH-25468)"
This reverts commit 89d1550.
1 parent 609c743 commit cb95787

File tree

3 files changed

+18
-30
lines changed

3 files changed

+18
-30
lines changed

Doc/library/ssl.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,11 +1078,6 @@ SSL Sockets
10781078
to create instances directly. This was never documented or officially
10791079
supported.
10801080

1081-
.. versionchanged:: 3.10
1082-
Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The
1083-
functions support reading and writing of data larger than 2 GB. Writing
1084-
zero-length data no longer fails with a protocol violation error.
1085-
10861081
SSL sockets also have the following additional methods and attributes:
10871082

10881083
.. method:: SSLSocket.read(len=1024, buffer=None)

Lib/test/test_ssl.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -888,17 +888,6 @@ def test_connect_ex_error(self):
888888
)
889889
self.assertIn(rc, errors)
890890

891-
def test_read_write_zero(self):
892-
# empty reads and writes now work, bpo-42854, bpo-31711
893-
client_context, server_context, hostname = testing_context()
894-
server = ThreadedEchoServer(context=server_context)
895-
with server:
896-
with client_context.wrap_socket(socket.socket(),
897-
server_hostname=hostname) as s:
898-
s.connect((HOST, server.port))
899-
self.assertEqual(s.recv(0), b"")
900-
self.assertEqual(s.send(b""), 0)
901-
902891

903892
class ContextTests(unittest.TestCase):
904893

Modules/_ssl.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2302,8 +2302,7 @@ static PyObject *
23022302
_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23032303
/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
23042304
{
2305-
size_t count = 0;
2306-
int retval;
2305+
int len;
23072306
int sockstate;
23082307
_PySSLError err;
23092308
int nonblocking;
@@ -2321,6 +2320,12 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23212320
Py_INCREF(sock);
23222321
}
23232322

2323+
if (b->len > INT_MAX) {
2324+
PyErr_Format(PyExc_OverflowError,
2325+
"string longer than %d bytes", INT_MAX);
2326+
goto error;
2327+
}
2328+
23242329
if (sock != NULL) {
23252330
/* just in case the blocking state of the socket has been changed */
23262331
nonblocking = (sock->sock_timeout >= 0);
@@ -2351,8 +2356,8 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23512356

23522357
do {
23532358
PySSL_BEGIN_ALLOW_THREADS
2354-
retval = SSL_write_ex(self->ssl, b->buf, (int)b->len, &count);
2355-
err = _PySSL_errno(retval == 0, self->ssl, retval);
2359+
len = SSL_write(self->ssl, b->buf, (int)b->len);
2360+
err = _PySSL_errno(len <= 0, self->ssl, len);
23562361
PySSL_END_ALLOW_THREADS
23572362
self->err = err;
23582363

@@ -2386,11 +2391,11 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23862391
err.ssl == SSL_ERROR_WANT_WRITE);
23872392

23882393
Py_XDECREF(sock);
2389-
if (retval == 0)
2390-
return PySSL_SetError(self, retval, __FILE__, __LINE__);
2394+
if (len <= 0)
2395+
return PySSL_SetError(self, len, __FILE__, __LINE__);
23912396
if (PySSL_ChainExceptions(self) < 0)
23922397
return NULL;
2393-
return PyLong_FromSize_t(count);
2398+
return PyLong_FromLong(len);
23942399
error:
23952400
Py_XDECREF(sock);
23962401
PySSL_ChainExceptions(self);
@@ -2440,8 +2445,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
24402445
{
24412446
PyObject *dest = NULL;
24422447
char *mem;
2443-
size_t count = 0;
2444-
int retval;
2448+
int count;
24452449
int sockstate;
24462450
_PySSLError err;
24472451
int nonblocking;
@@ -2504,8 +2508,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25042508

25052509
do {
25062510
PySSL_BEGIN_ALLOW_THREADS
2507-
retval = SSL_read_ex(self->ssl, mem, len, &count);
2508-
err = _PySSL_errno(retval == 0, self->ssl, retval);
2511+
count = SSL_read(self->ssl, mem, len);
2512+
err = _PySSL_errno(count <= 0, self->ssl, count);
25092513
PySSL_END_ALLOW_THREADS
25102514
self->err = err;
25112515

@@ -2539,8 +2543,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25392543
} while (err.ssl == SSL_ERROR_WANT_READ ||
25402544
err.ssl == SSL_ERROR_WANT_WRITE);
25412545

2542-
if (retval == 0) {
2543-
PySSL_SetError(self, retval, __FILE__, __LINE__);
2546+
if (count <= 0) {
2547+
PySSL_SetError(self, count, __FILE__, __LINE__);
25442548
goto error;
25452549
}
25462550
if (self->exc_type != NULL)
@@ -2553,7 +2557,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25532557
return dest;
25542558
}
25552559
else {
2556-
return PyLong_FromSize_t(count);
2560+
return PyLong_FromLong(count);
25572561
}
25582562

25592563
error:

0 commit comments

Comments
 (0)