diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-03 18:38:17 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-03 18:38:17 (GMT) |
commit | 24e561ae0473ad6f46709e38ed8ebc97d89fc55e (patch) | |
tree | 7e536c12b8cc11641329f5354234bf627c943867 | |
parent | aa44b2b5ca45eaa0287fd59c62ed964550b7da96 (diff) | |
download | cpython-24e561ae0473ad6f46709e38ed8ebc97d89fc55e.zip cpython-24e561ae0473ad6f46709e38ed8ebc97d89fc55e.tar.gz cpython-24e561ae0473ad6f46709e38ed8ebc97d89fc55e.tar.bz2 |
Issue #3805: clean up implementation of the _read method in _ssl.c.
-rw-r--r-- | Lib/ssl.py | 6 | ||||
-rw-r--r-- | Modules/_ssl.c | 59 |
2 files changed, 33 insertions, 32 deletions
@@ -199,14 +199,14 @@ class SSLSocket(socket): self._checkClosed() try: - if buffer: - v = self._sslobj.read(buffer, len) + if buffer is not None: + v = self._sslobj.read(len, buffer) else: v = self._sslobj.read(len or 1024) return v except SSLError as x: if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs: - if buffer: + if buffer is not None: return 0 else: return b'' diff --git a/Modules/_ssl.c b/Modules/_ssl.c index ba5972a..fd0ea43 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1156,11 +1156,9 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) { PyObject *dest = NULL; Py_buffer buf; - int buf_passed = 0; - int count = -1; char *mem; - /* XXX this should use Py_ssize_t */ - int len = 1024; + int len, count; + int buf_passed = 0; int sockstate; int err; int nonblocking; @@ -1174,26 +1172,28 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) } Py_INCREF(sock); - if (!PyArg_ParseTuple(args, "|Oi:read", &dest, &count)) + buf.obj = NULL; + buf.buf = NULL; + if (!PyArg_ParseTuple(args, "i|w*:read", &len, &buf)) goto error; - if ((dest == NULL) || (dest == Py_None)) { - if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len))) - goto error; - mem = PyByteArray_AS_STRING(dest); - } else if (PyLong_Check(dest)) { - len = PyLong_AS_LONG(dest); - if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len))) + if ((buf.buf == NULL) && (buf.obj == NULL)) { + dest = PyBytes_FromStringAndSize(NULL, len); + if (dest == NULL) goto error; - mem = PyByteArray_AS_STRING(dest); - } else { - if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0) - goto error; - mem = buf.buf; - len = buf.len; - if ((count > 0) && (count <= len)) - len = count; + mem = PyBytes_AS_STRING(dest); + } + else { buf_passed = 1; + mem = buf.buf; + if (len <= 0 || len > buf.len) { + len = (int) buf.len; + if (buf.len != len) { + PyErr_SetString(PyExc_OverflowError, + "maximum length can't fit in a C 'int'"); + goto error; + } + } } /* just in case the blocking state of the socket has been changed */ @@ -1254,23 +1254,24 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) PySSL_SetError(self, count, __FILE__, __LINE__); goto error; } - done: + +done: Py_DECREF(sock); if (!buf_passed) { - PyObject *res = PyBytes_FromStringAndSize(mem, count); - Py_DECREF(dest); - return res; - } else { + _PyBytes_Resize(&dest, count); + return dest; + } + else { PyBuffer_Release(&buf); return PyLong_FromLong(count); } - error: + +error: Py_DECREF(sock); - if (!buf_passed) { + if (!buf_passed) Py_XDECREF(dest); - } else { + else PyBuffer_Release(&buf); - } return NULL; } |