]> granicus.if.org Git - python/commitdiff
Merged revisions 81241 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:14:34 +0000 (23:14 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:14:34 +0000 (23:14 +0000)
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.
........

Modules/_ssl.c

index ff634d6894bc5be0ddc779414776d4eb1ef53c95..c02703dab89d515e1a172de0681371f5257df0db 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);