Skip to content

Commit 2a78663

Browse files
[3.13] gh-127257: ssl: Raise OSError for ERR_LIB_SYS (GH-127361) (GH-127812)
gh-127257: ssl: Raise OSError for ERR_LIB_SYS (GH-127361) From the ERR_raise manpage: ERR_LIB_SYS This "library code" indicates that a system error is being reported. In this case, the reason code given to `ERR_raise()` and `ERR_raise_data()` *must* be `errno(3)`. This PR only handles ERR_LIB_SYS for the high-lever error types SSL_ERROR_SYSCALL and SSL_ERROR_SSL, i.e., not the ones where OpenSSL indicates it has some more information about the issue. (cherry picked from commit f4b31ed) Co-authored-by: Petr Viktorin <[email protected]>
1 parent 8b24d04 commit 2a78663

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
In :mod:`ssl`, system call failures that OpenSSL reports using
2+
``ERR_LIB_SYS`` are now raised as :exc:`OSError`.

Modules/_ssl.c

+10
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,11 @@ PySSL_SetError(PySSLSocket *sslsock, const char *filename, int lineno)
661661
ERR_GET_REASON(e) == SSL_R_CERTIFICATE_VERIFY_FAILED) {
662662
type = state->PySSLCertVerificationErrorObject;
663663
}
664+
if (ERR_GET_LIB(e) == ERR_LIB_SYS) {
665+
// A system error is being reported; reason is set to errno
666+
errno = ERR_GET_REASON(e);
667+
return PyErr_SetFromErrno(PyExc_OSError);
668+
}
664669
p = PY_SSL_ERROR_SYSCALL;
665670
}
666671
break;
@@ -686,6 +691,11 @@ PySSL_SetError(PySSLSocket *sslsock, const char *filename, int lineno)
686691
errstr = "EOF occurred in violation of protocol";
687692
}
688693
#endif
694+
if (ERR_GET_LIB(e) == ERR_LIB_SYS) {
695+
// A system error is being reported; reason is set to errno
696+
errno = ERR_GET_REASON(e);
697+
return PyErr_SetFromErrno(PyExc_OSError);
698+
}
689699
break;
690700
}
691701
default:

0 commit comments

Comments
 (0)