]> granicus.if.org Git - python/commitdiff
Clear the OpenSSL error queue each time an error is signalled.
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:11:46 +0000 (23:11 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:11:46 +0000 (23:11 +0000)
When the error queue is not emptied, strange things can happen on the next SSL call, depending on the OpenSSL version.

Modules/_ssl.c

index eb5e80fb81676c22cc5e5e70b43c16febb6d263e..fe029ceef66d1b43a91ffa0efdd563a183c0fe5d 100644 (file)
@@ -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);