summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-09-03 18:39:47 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-09-03 18:39:47 (GMT)
commit10c4c23a252294801e44de6d162e3f486baf1784 (patch)
treeb78800aa0cc3e47f9df9138bb770153e5025adff /Modules
parent23ef20f46140603e372c9bcd78110aa6bb9c361d (diff)
downloadcpython-10c4c23a252294801e44de6d162e3f486baf1784.zip
cpython-10c4c23a252294801e44de6d162e3f486baf1784.tar.gz
cpython-10c4c23a252294801e44de6d162e3f486baf1784.tar.bz2
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. ........
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_ssl.c59
1 files changed, 30 insertions, 29 deletions
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;
}