summaryrefslogtreecommitdiffstats
path: root/Modules/_ssl.c
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2024-12-10 10:56:24 (GMT)
committerGitHub <noreply@github.com>2024-12-10 10:56:24 (GMT)
commitf4b31edf2d9d72878dab1f66a36913b5bcc848ec (patch)
tree7654af84b954b02f9d5f8329ed4271e0264dc89b /Modules/_ssl.c
parent690fe077f6b1bf50e9d62078b22c334775efb3af (diff)
downloadcpython-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.c10
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: