bpo-42854: Correctly use size_t for _ssl._SSLSocket.read and _ssl._SSLSocket.write (GH-27271)

This commit is contained in:
Pablo Galindo Salgado 2021-07-23 16:05:53 +01:00 committed by GitHub
parent 8f42106b5c
commit 83d1430ee5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 12 deletions

View File

@ -0,0 +1,3 @@
Fixed a bug in the :mod:`_ssl` module that was throwing :exc:`OverflowError`
when using :meth:`_ssl._SSLSocket.write` and :meth:`_ssl._SSLSocket.read`
for a big value of the ``len`` parameter. Patch by Pablo Galindo

View File

@ -2346,7 +2346,7 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
do { do {
PySSL_BEGIN_ALLOW_THREADS PySSL_BEGIN_ALLOW_THREADS
retval = SSL_write_ex(self->ssl, b->buf, (int)b->len, &count); retval = SSL_write_ex(self->ssl, b->buf, (size_t)b->len, &count);
err = _PySSL_errno(retval == 0, self->ssl, retval); err = _PySSL_errno(retval == 0, self->ssl, retval);
PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS
self->err = err; self->err = err;
@ -2418,7 +2418,7 @@ _ssl__SSLSocket_pending_impl(PySSLSocket *self)
/*[clinic input] /*[clinic input]
_ssl._SSLSocket.read _ssl._SSLSocket.read
size as len: int size as len: Py_ssize_t
[ [
buffer: Py_buffer(accept={rwbuffer}) buffer: Py_buffer(accept={rwbuffer})
] ]
@ -2428,9 +2428,9 @@ Read up to size bytes from the SSL socket.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1, _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
Py_buffer *buffer) int group_right_1, Py_buffer *buffer)
/*[clinic end generated code: output=00097776cec2a0af input=ff157eb918d0905b]*/ /*[clinic end generated code: output=49b16e6406023734 input=ec48bf622be1c4a1]*/
{ {
PyObject *dest = NULL; PyObject *dest = NULL;
char *mem; char *mem;
@ -2498,7 +2498,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
do { do {
PySSL_BEGIN_ALLOW_THREADS PySSL_BEGIN_ALLOW_THREADS
retval = SSL_read_ex(self->ssl, mem, len, &count); retval = SSL_read_ex(self->ssl, mem, (size_t)len, &count);
err = _PySSL_errno(retval == 0, self->ssl, retval); err = _PySSL_errno(retval == 0, self->ssl, retval);
PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS
self->err = err; self->err = err;

View File

@ -271,25 +271,25 @@ PyDoc_STRVAR(_ssl__SSLSocket_read__doc__,
{"read", (PyCFunction)_ssl__SSLSocket_read, METH_VARARGS, _ssl__SSLSocket_read__doc__}, {"read", (PyCFunction)_ssl__SSLSocket_read, METH_VARARGS, _ssl__SSLSocket_read__doc__},
static PyObject * static PyObject *
_ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1, _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
Py_buffer *buffer); int group_right_1, Py_buffer *buffer);
static PyObject * static PyObject *
_ssl__SSLSocket_read(PySSLSocket *self, PyObject *args) _ssl__SSLSocket_read(PySSLSocket *self, PyObject *args)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
int len; Py_ssize_t len;
int group_right_1 = 0; int group_right_1 = 0;
Py_buffer buffer = {NULL, NULL}; Py_buffer buffer = {NULL, NULL};
switch (PyTuple_GET_SIZE(args)) { switch (PyTuple_GET_SIZE(args)) {
case 1: case 1:
if (!PyArg_ParseTuple(args, "i:read", &len)) { if (!PyArg_ParseTuple(args, "n:read", &len)) {
goto exit; goto exit;
} }
break; break;
case 2: case 2:
if (!PyArg_ParseTuple(args, "iw*:read", &len, &buffer)) { if (!PyArg_ParseTuple(args, "nw*:read", &len, &buffer)) {
goto exit; goto exit;
} }
group_right_1 = 1; group_right_1 = 1;
@ -1358,4 +1358,4 @@ exit:
#ifndef _SSL_ENUM_CRLS_METHODDEF #ifndef _SSL_ENUM_CRLS_METHODDEF
#define _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF
#endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */
/*[clinic end generated code: output=3b6f4471fb187d85 input=a9049054013a1b77]*/ /*[clinic end generated code: output=5a7d7bf5cf8ee092 input=a9049054013a1b77]*/