]> granicus.if.org Git - python/commitdiff
Merged revisions 81242 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:18:00 +0000 (23:18 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 May 2010 23:18:00 +0000 (23:18 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r81242 | antoine.pitrou | 2010-05-17 01:14:22 +0200 (lun., 17 mai 2010) | 10 lines

  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.
  ........
................

Modules/_ssl.c

index 9ce73cfa494e1f0cdcf5672ef441b7f432f899ff..5bc2e50311ed11901cb81dd915459c2a89401fc9 100644 (file)
@@ -199,6 +199,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 s->errorhandler();
                 } else { /* possible? */
                     p = PY_SSL_ERROR_SYSCALL;
@@ -231,6 +232,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);
@@ -250,6 +252,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);