Skip to content

Commit

Permalink
Revert "bpo-42854: Use SSL_read/write_ex() (pythonGH-25468)"
Browse files Browse the repository at this point in the history
This reverts commit 89d1550.
  • Loading branch information
WillChilds-Klein committed Mar 25, 2024
1 parent c4b819a commit 2a87fb4
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 30 deletions.
5 changes: 0 additions & 5 deletions Doc/library/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1157,11 +1157,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 @@ -1130,17 +1130,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 @@ -2352,8 +2352,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 @@ -2371,6 +2370,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 @@ -2400,8 +2405,8 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)

do {
PySSL_BEGIN_ALLOW_THREADS
retval = SSL_write_ex(self->ssl, b->buf, (size_t)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 @@ -2434,11 +2439,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 @@ -2488,8 +2493,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
{
PyObject *dest = NULL;
char *mem;
size_t count = 0;
int retval;
int count;
int sockstate;
_PySSLError err;
int nonblocking;
Expand Down Expand Up @@ -2552,8 +2556,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,

do {
PySSL_BEGIN_ALLOW_THREADS
retval = SSL_read_ex(self->ssl, mem, (size_t)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 @@ -2586,8 +2590,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
} 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 @@ -2600,7 +2604,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
return dest;
}
else {
return PyLong_FromSize_t(count);
return PyLong_FromLong(count);
}

error:
Expand Down

0 comments on commit 2a87fb4

Please sign in to comment.