mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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. ........
This commit is contained in:
parent
23ef20f461
commit
10c4c23a25
2 changed files with 33 additions and 32 deletions
|
@ -162,14 +162,14 @@ class SSLSocket(socket):
|
||||||
|
|
||||||
self._checkClosed()
|
self._checkClosed()
|
||||||
try:
|
try:
|
||||||
if buffer:
|
if buffer is not None:
|
||||||
v = self._sslobj.read(buffer, len)
|
v = self._sslobj.read(len, buffer)
|
||||||
else:
|
else:
|
||||||
v = self._sslobj.read(len or 1024)
|
v = self._sslobj.read(len or 1024)
|
||||||
return v
|
return v
|
||||||
except SSLError as x:
|
except SSLError as x:
|
||||||
if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
|
if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
|
||||||
if buffer:
|
if buffer is not None:
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
return b''
|
return b''
|
||||||
|
|
|
@ -1277,11 +1277,9 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *dest = NULL;
|
PyObject *dest = NULL;
|
||||||
Py_buffer buf;
|
Py_buffer buf;
|
||||||
int buf_passed = 0;
|
|
||||||
int count = -1;
|
|
||||||
char *mem;
|
char *mem;
|
||||||
/* XXX this should use Py_ssize_t */
|
int len, count;
|
||||||
int len = 1024;
|
int buf_passed = 0;
|
||||||
int sockstate;
|
int sockstate;
|
||||||
int err;
|
int err;
|
||||||
int nonblocking;
|
int nonblocking;
|
||||||
|
@ -1295,26 +1293,28 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
|
||||||
}
|
}
|
||||||
Py_INCREF(sock);
|
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;
|
goto error;
|
||||||
|
|
||||||
if ((dest == NULL) || (dest == Py_None)) {
|
if ((buf.buf == NULL) && (buf.obj == NULL)) {
|
||||||
if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
|
dest = PyBytes_FromStringAndSize(NULL, len);
|
||||||
|
if (dest == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
mem = PyByteArray_AS_STRING(dest);
|
mem = PyBytes_AS_STRING(dest);
|
||||||
} else if (PyLong_Check(dest)) {
|
}
|
||||||
len = PyLong_AS_LONG(dest);
|
else {
|
||||||
if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
|
|
||||||
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;
|
|
||||||
buf_passed = 1;
|
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 */
|
/* 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__);
|
PySSL_SetError(self, count, __FILE__, __LINE__);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
Py_DECREF(sock);
|
Py_DECREF(sock);
|
||||||
if (!buf_passed) {
|
if (!buf_passed) {
|
||||||
PyObject *res = PyBytes_FromStringAndSize(mem, count);
|
_PyBytes_Resize(&dest, count);
|
||||||
Py_DECREF(dest);
|
return dest;
|
||||||
return res;
|
}
|
||||||
} else {
|
else {
|
||||||
PyBuffer_Release(&buf);
|
PyBuffer_Release(&buf);
|
||||||
return PyLong_FromLong(count);
|
return PyLong_FromLong(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
Py_DECREF(sock);
|
Py_DECREF(sock);
|
||||||
if (!buf_passed) {
|
if (!buf_passed)
|
||||||
Py_XDECREF(dest);
|
Py_XDECREF(dest);
|
||||||
} else {
|
else
|
||||||
PyBuffer_Release(&buf);
|
PyBuffer_Release(&buf);
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue