summaryrefslogtreecommitdiff
path: root/Modules/_ssl.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-05-16 23:11:46 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2010-05-16 23:11:46 +0000
commit508a237c9791e9e4913d6e61f006aabec0f7ea7d (patch)
treea5160bd593555f2bd11f1468952850e9b833ab91 /Modules/_ssl.c
parent308c2af9a4d0bfc107e53f311c34905ad45b86a4 (diff)
downloadcpython-git-508a237c9791e9e4913d6e61f006aabec0f7ea7d.tar.gz
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.
Diffstat (limited to 'Modules/_ssl.c')
-rw-r--r--Modules/_ssl.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index eb5e80fb81..fe029ceef6 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -196,6 +196,7 @@ PySSL_SetError(PySSLObject *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 obj->Socket->errorhandler();
} else { /* possible? */
p = PY_SSL_ERROR_SYSCALL;
@@ -228,6 +229,7 @@ PySSL_SetError(PySSLObject *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);
@@ -247,6 +249,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);