From 10c4c23a252294801e44de6d162e3f486baf1784 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 3 Sep 2010 18:39:47 +0000 Subject: Merged revisions 84464 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r84464 | antoine.pitrou | 2010-09-03 20:38:17 +0200 (ven., 03 sept. 2010) | 3 lines Issue #3805: clean up implementation of the _read method in _ssl.c. ........ --- Lib/ssl.py | 6 +++--- Modules/_ssl.c | 59 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Lib/ssl.py b/Lib/ssl.py index ec64469..0ba3442 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -162,14 +162,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 8eb9a1e..b98b03b 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1277,11 +1277,9 @@ static PyObject *PySSL_SSLread(PySSLObject *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; @@ -1295,26 +1293,28 @@ static PyObject *PySSL_SSLread(PySSLObject *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))) - goto error; - mem = PyByteArray_AS_STRING(dest); - } else { - if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0) + if ((buf.buf == NULL) && (buf.obj == NULL)) { + dest = PyBytes_FromStringAndSize(NULL, len); + if (dest == NULL) 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 */ @@ -1375,23 +1375,24 @@ static PyObject *PySSL_SSLread(PySSLObject *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; } -- cgit v0.12