summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-05-16 23:14:22 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2010-05-16 23:14:22 +0000
commit9d74b42aca83c3fcf2f45f9f7b505fd688ffa78c (patch)
tree5d69423ebddea667f702c05a0b6a2ecb7c446da8
parentf9faaad80107338b2248b0486bc7069b06f19677 (diff)
downloadcpython-git-9d74b42aca83c3fcf2f45f9f7b505fd688ffa78c.tar.gz
Merged revisions 81241 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r81241 | antoine.pitrou | 2010-05-17 01:11:46 +0200 (lun., 17 mai 2010) | 4 lines Clear the OpenSSL error queue each time an error is signalled. When the error queue is not emptied, strange things can happen on the next SSL call, depending on the OpenSSL version. ........
-rw-r--r--Modules/_ssl.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 4aa1e2d6ec..e4b6fedf19 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -205,6 +205,7 @@ PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
errstr = "EOF occurred in violation of protocol";
} else if (ret == -1) {
/* underlying BIO reported an I/O error */
+ ERR_clear_error();
return s->errorhandler();
} else { /* possible? */
p = PY_SSL_ERROR_SYSCALL;
@@ -237,6 +238,7 @@ PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
errstr = ERR_error_string(ERR_peek_last_error(), NULL);
}
PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
+ ERR_clear_error();
v = Py_BuildValue("(is)", p, buf);
if (v != NULL) {
PyErr_SetObject(PySSLErrorObject, v);
@@ -256,6 +258,7 @@ _setSSLError (char *errstr, int errcode, char *filename, int lineno) {
errstr = ERR_error_string(errcode, NULL);
}
PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
+ ERR_clear_error();
v = Py_BuildValue("(is)", errcode, buf);
if (v != NULL) {
PyErr_SetObject(PySSLErrorObject, v);