diff options
author | Petr Viktorin <encukou@gmail.com> | 2024-12-10 10:56:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-10 10:56:24 (GMT) |
commit | f4b31edf2d9d72878dab1f66a36913b5bcc848ec (patch) | |
tree | 7654af84b954b02f9d5f8329ed4271e0264dc89b /Modules/_ssl.c | |
parent | 690fe077f6b1bf50e9d62078b22c334775efb3af (diff) | |
download | cpython-f4b31edf2d9d72878dab1f66a36913b5bcc848ec.zip cpython-f4b31edf2d9d72878dab1f66a36913b5bcc848ec.tar.gz cpython-f4b31edf2d9d72878dab1f66a36913b5bcc848ec.tar.bz2 |
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.
Diffstat (limited to 'Modules/_ssl.c')
-rw-r--r-- | Modules/_ssl.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 59c414f..e7df132 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -667,6 +667,11 @@ PySSL_SetError(PySSLSocket *sslsock, const char *filename, int lineno) ERR_GET_REASON(e) == SSL_R_CERTIFICATE_VERIFY_FAILED) { type = state->PySSLCertVerificationErrorObject; } + if (ERR_GET_LIB(e) == ERR_LIB_SYS) { + // A system error is being reported; reason is set to errno + errno = ERR_GET_REASON(e); + return PyErr_SetFromErrno(PyExc_OSError); + } p = PY_SSL_ERROR_SYSCALL; } break; @@ -692,6 +697,11 @@ PySSL_SetError(PySSLSocket *sslsock, const char *filename, int lineno) errstr = "EOF occurred in violation of protocol"; } #endif + if (ERR_GET_LIB(e) == ERR_LIB_SYS) { + // A system error is being reported; reason is set to errno + errno = ERR_GET_REASON(e); + return PyErr_SetFromErrno(PyExc_OSError); + } break; } default: |