Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Revert "bpo-42854: Use SSL_read/write_ex() (GH-25468)"
This reverts commit 89d1550.
  • Loading branch information
tiran committed Aug 3, 2022
commit 7acf0fe18f2035b3e7b1ce176450f95c6e676f4e
5 changes: 0 additions & 5 deletions Doc/library/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1155,11 +1155,6 @@ SSL Sockets
to create instances directly. This was never documented or officially
supported.

.. versionchanged:: 3.10
Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The
functions support reading and writing of data larger than 2 GB. Writing
zero-length data no longer fails with a protocol violation error.

SSL sockets also have the following additional methods and attributes:

.. method:: SSLSocket.read(len=1024, buffer=None)
Expand Down
11 changes: 0 additions & 11 deletions Lib/test/test_ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -1128,17 +1128,6 @@ def test_connect_ex_error(self):
)
self.assertIn(rc, errors)

def test_read_write_zero(self):
# empty reads and writes now work, bpo-42854, bpo-31711
client_context, server_context, hostname = testing_context()
server = ThreadedEchoServer(context=server_context)
with server:
with client_context.wrap_socket(socket.socket(),
server_hostname=hostname) as s:
s.connect((HOST, server.port))
self.assertEqual(s.recv(0), b"")
self.assertEqual(s.send(b""), 0)


class ContextTests(unittest.TestCase):

Expand Down
32 changes: 18 additions & 14 deletions Modules/_ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2305,8 +2305,7 @@ static PyObject *
_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
{
size_t count = 0;
int retval;
int len;
int sockstate;
_PySSLError err;
int nonblocking;
Expand All @@ -2324,6 +2323,12 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
Py_INCREF(sock);
}

if (b->len > INT_MAX) {
PyErr_Format(PyExc_OverflowError,
"string longer than %d bytes", INT_MAX);
goto error;
}

if (sock != NULL) {
/* just in case the blocking state of the socket has been changed */
nonblocking = (sock->sock_timeout >= 0);
Expand Down Expand Up @@ -2354,8 +2359,8 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)

do {
PySSL_BEGIN_ALLOW_THREADS
retval = SSL_write_ex(self->ssl, b->buf, (int)b->len, &count);
err = _PySSL_errno(retval == 0, self->ssl, retval);
len = SSL_write(self->ssl, b->buf, (int)b->len);
err = _PySSL_errno(len <= 0, self->ssl, len);
PySSL_END_ALLOW_THREADS
self->err = err;

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

Py_XDECREF(sock);
if (retval == 0)
return PySSL_SetError(self, retval, __FILE__, __LINE__);
if (len <= 0)
return PySSL_SetError(self, len, __FILE__, __LINE__);
if (PySSL_ChainExceptions(self) < 0)
return NULL;
return PyLong_FromSize_t(count);
return PyLong_FromLong(len);
error:
Py_XDECREF(sock);
PySSL_ChainExceptions(self);
Expand Down Expand Up @@ -2443,8 +2448,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
{
PyObject *dest = NULL;
char *mem;
size_t count = 0;
int retval;
int count;
int sockstate;
_PySSLError err;
int nonblocking;
Expand Down Expand Up @@ -2507,8 +2511,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,

do {
PySSL_BEGIN_ALLOW_THREADS
retval = SSL_read_ex(self->ssl, mem, len, &count);
err = _PySSL_errno(retval == 0, self->ssl, retval);
count = SSL_read(self->ssl, mem, len);
err = _PySSL_errno(count <= 0, self->ssl, count);
PySSL_END_ALLOW_THREADS
self->err = err;

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

if (retval == 0) {
PySSL_SetError(self, retval, __FILE__, __LINE__);
if (count <= 0) {
PySSL_SetError(self, count, __FILE__, __LINE__);
goto error;
}
if (self->exc_type != NULL)
Expand All @@ -2556,7 +2560,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
return dest;
}
else {
return PyLong_FromSize_t(count);
return PyLong_FromLong(count);
}

error:
Expand Down