Skip to content

Commit 7acf0fe

Browse files
committed
Revert "bpo-42854: Use SSL_read/write_ex() (GH-25468)"
This reverts commit 89d1550.
1 parent ca3d2be commit 7acf0fe

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
@@ -1155,11 +1155,6 @@ SSL Sockets
11551155
to create instances directly. This was never documented or officially
11561156
supported.
11571157

1158-
.. versionchanged:: 3.10
1159-
Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The
1160-
functions support reading and writing of data larger than 2 GB. Writing
1161-
zero-length data no longer fails with a protocol violation error.
1162-
11631158
SSL sockets also have the following additional methods and attributes:
11641159

11651160
.. 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
@@ -1128,17 +1128,6 @@ def test_connect_ex_error(self):
11281128
)
11291129
self.assertIn(rc, errors)
11301130

1131-
def test_read_write_zero(self):
1132-
# empty reads and writes now work, bpo-42854, bpo-31711
1133-
client_context, server_context, hostname = testing_context()
1134-
server = ThreadedEchoServer(context=server_context)
1135-
with server:
1136-
with client_context.wrap_socket(socket.socket(),
1137-
server_hostname=hostname) as s:
1138-
s.connect((HOST, server.port))
1139-
self.assertEqual(s.recv(0), b"")
1140-
self.assertEqual(s.send(b""), 0)
1141-
11421131

11431132
class ContextTests(unittest.TestCase):
11441133

Modules/_ssl.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2305,8 +2305,7 @@ static PyObject *
23052305
_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23062306
/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
23072307
{
2308-
size_t count = 0;
2309-
int retval;
2308+
int len;
23102309
int sockstate;
23112310
_PySSLError err;
23122311
int nonblocking;
@@ -2324,6 +2323,12 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23242323
Py_INCREF(sock);
23252324
}
23262325

2326+
if (b->len > INT_MAX) {
2327+
PyErr_Format(PyExc_OverflowError,
2328+
"string longer than %d bytes", INT_MAX);
2329+
goto error;
2330+
}
2331+
23272332
if (sock != NULL) {
23282333
/* just in case the blocking state of the socket has been changed */
23292334
nonblocking = (sock->sock_timeout >= 0);
@@ -2354,8 +2359,8 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23542359

23552360
do {
23562361
PySSL_BEGIN_ALLOW_THREADS
2357-
retval = SSL_write_ex(self->ssl, b->buf, (int)b->len, &count);
2358-
err = _PySSL_errno(retval == 0, self->ssl, retval);
2362+
len = SSL_write(self->ssl, b->buf, (int)b->len);
2363+
err = _PySSL_errno(len <= 0, self->ssl, len);
23592364
PySSL_END_ALLOW_THREADS
23602365
self->err = err;
23612366

@@ -2389,11 +2394,11 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
23892394
err.ssl == SSL_ERROR_WANT_WRITE);
23902395

23912396
Py_XDECREF(sock);
2392-
if (retval == 0)
2393-
return PySSL_SetError(self, retval, __FILE__, __LINE__);
2397+
if (len <= 0)
2398+
return PySSL_SetError(self, len, __FILE__, __LINE__);
23942399
if (PySSL_ChainExceptions(self) < 0)
23952400
return NULL;
2396-
return PyLong_FromSize_t(count);
2401+
return PyLong_FromLong(len);
23972402
error:
23982403
Py_XDECREF(sock);
23992404
PySSL_ChainExceptions(self);
@@ -2443,8 +2448,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
24432448
{
24442449
PyObject *dest = NULL;
24452450
char *mem;
2446-
size_t count = 0;
2447-
int retval;
2451+
int count;
24482452
int sockstate;
24492453
_PySSLError err;
24502454
int nonblocking;
@@ -2507,8 +2511,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25072511

25082512
do {
25092513
PySSL_BEGIN_ALLOW_THREADS
2510-
retval = SSL_read_ex(self->ssl, mem, len, &count);
2511-
err = _PySSL_errno(retval == 0, self->ssl, retval);
2514+
count = SSL_read(self->ssl, mem, len);
2515+
err = _PySSL_errno(count <= 0, self->ssl, count);
25122516
PySSL_END_ALLOW_THREADS
25132517
self->err = err;
25142518

@@ -2542,8 +2546,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25422546
} while (err.ssl == SSL_ERROR_WANT_READ ||
25432547
err.ssl == SSL_ERROR_WANT_WRITE);
25442548

2545-
if (retval == 0) {
2546-
PySSL_SetError(self, retval, __FILE__, __LINE__);
2549+
if (count <= 0) {
2550+
PySSL_SetError(self, count, __FILE__, __LINE__);
25472551
goto error;
25482552
}
25492553
if (self->exc_type != NULL)
@@ -2556,7 +2560,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
25562560
return dest;
25572561
}
25582562
else {
2559-
return PyLong_FromSize_t(count);
2563+
return PyLong_FromLong(count);
25602564
}
25612565

25622566
error:

0 commit comments

Comments
 (0)