diff options
author | Georg Brandl <georg@python.org> | 2006-03-31 18:01:16 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2006-03-31 18:01:16 (GMT) |
commit | 43f08a85e4b86acf6e4313a51cec4df0cc586da7 (patch) | |
tree | f1e9812632d468fa2340e1db157b70926117be42 /Modules/_ssl.c | |
parent | dd2245f2309da358b4c0b56d6a3a411888052f26 (diff) | |
download | cpython-43f08a85e4b86acf6e4313a51cec4df0cc586da7.zip cpython-43f08a85e4b86acf6e4313a51cec4df0cc586da7.tar.gz cpython-43f08a85e4b86acf6e4313a51cec4df0cc586da7.tar.bz2 |
Patch #1380952: fix SSL objects timing out on consecutive read()s
Diffstat (limited to 'Modules/_ssl.c')
-rw-r--r-- | Modules/_ssl.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 5f541f5..0c085a8 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -474,15 +474,22 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args) if (!(buf = PyString_FromStringAndSize((char *) 0, len))) return NULL; + + /* first check if there are bytes ready to be read */ + Py_BEGIN_ALLOW_THREADS + count = SSL_pending(self->ssl); + Py_END_ALLOW_THREADS - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); - if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, "The read operation timed out"); - Py_DECREF(buf); - return NULL; - } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { - PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); - return NULL; + if (!count) { + sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + if (sockstate == SOCKET_HAS_TIMED_OUT) { + PyErr_SetString(PySSLErrorObject, "The read operation timed out"); + Py_DECREF(buf); + return NULL; + } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { + PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); + return NULL; + } } do { err = 0; |