Mercurial > cpython-lru_cache-weakref
diff Modules/_ssl.c @ 64403:70019c5cf35f
Issue #3805: clean up implementation of the _read method in _ssl.c.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Fri, 03 Sep 2010 18:38:17 +0000 |
| parents | 063b554d3153 |
| children | 9c723afa44da |
line wrap: on
line diff
--- a/Modules/_ssl.c Fri Sep 03 18:36:11 2010 +0000 +++ b/Modules/_ssl.c Fri Sep 03 18:38:17 2010 +0000 @@ -1156,11 +1156,9 @@ { PyObject *dest = NULL; Py_buffer buf; + char *mem; + int len, count; int buf_passed = 0; - int count = -1; - char *mem; - /* XXX this should use Py_ssize_t */ - int len = 1024; int sockstate; int err; int nonblocking; @@ -1174,26 +1172,28 @@ } 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 = PyBytes_AS_STRING(dest); + } + else { + buf_passed = 1; mem = buf.buf; - len = buf.len; - if ((count > 0) && (count <= len)) - len = count; - buf_passed = 1; + 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 @@ 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; }
