diff Modules/_ssl.c @ 61643:8a0079d8d1ce legacy-trunk

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.
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 16 May 2010 23:11:46 +0000
parents e1836a7b6b6e
children 46b487e4a75b
line wrap: on
line diff
--- a/Modules/_ssl.c	Sun May 16 14:16:56 2010 +0000
+++ b/Modules/_ssl.c	Sun May 16 23:11:46 2010 +0000
@@ -196,6 +196,7 @@
                     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 @@
         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 @@
         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);