summaryrefslogtreecommitdiffstats
path: root/Modules/_ssl.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-10-01 11:29:25 (GMT)
committerGitHub <noreply@github.com>2021-10-01 11:29:25 (GMT)
commit833fdf126c8fe77fd17e8a8ffbc5c571b3bf64bd (patch)
tree7e4ed574b7cfb30c0ebb7585061134fee1b1f8ae /Modules/_ssl.c
parent54957f16a63ecb6b15f77b01fa7c55ada892604a (diff)
downloadcpython-833fdf126c8fe77fd17e8a8ffbc5c571b3bf64bd.zip
cpython-833fdf126c8fe77fd17e8a8ffbc5c571b3bf64bd.tar.gz
cpython-833fdf126c8fe77fd17e8a8ffbc5c571b3bf64bd.tar.bz2
bpo-41710: Add private _PyDeadline_Get() function (GH-28674)
Add a private C API for deadlines: add _PyDeadline_Init() and _PyDeadline_Get() functions. * Add _PyTime_Add() and _PyTime_Mul() functions which compute t1+t2 and t1*t2 and clamp the result on overflow. * _PyTime_MulDiv() now uses _PyTime_Add() and _PyTime_Mul().
Diffstat (limited to 'Modules/_ssl.c')
-rw-r--r--Modules/_ssl.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 411314f..fedb35b 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -949,8 +949,9 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
timeout = GET_SOCKET_TIMEOUT(sock);
has_timeout = (timeout > 0);
- if (has_timeout)
- deadline = _PyTime_GetMonotonicClock() + timeout;
+ if (has_timeout) {
+ deadline = _PyDeadline_Init(timeout);
+ }
/* Actually negotiate SSL connection */
/* XXX If SSL_do_handshake() returns 0, it's also a failure. */
@@ -965,7 +966,7 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
goto error;
if (has_timeout)
- timeout = deadline - _PyTime_GetMonotonicClock();
+ timeout = _PyDeadline_Get(deadline);
if (err.ssl == SSL_ERROR_WANT_READ) {
sockstate = PySSL_select(sock, 0, timeout);
@@ -2326,8 +2327,9 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
timeout = GET_SOCKET_TIMEOUT(sock);
has_timeout = (timeout > 0);
- if (has_timeout)
- deadline = _PyTime_GetMonotonicClock() + timeout;
+ if (has_timeout) {
+ deadline = _PyDeadline_Init(timeout);
+ }
sockstate = PySSL_select(sock, 1, timeout);
if (sockstate == SOCKET_HAS_TIMED_OUT) {
@@ -2354,8 +2356,9 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
if (PyErr_CheckSignals())
goto error;
- if (has_timeout)
- timeout = deadline - _PyTime_GetMonotonicClock();
+ if (has_timeout) {
+ timeout = _PyDeadline_Get(deadline);
+ }
if (err.ssl == SSL_ERROR_WANT_READ) {
sockstate = PySSL_select(sock, 0, timeout);
@@ -2494,7 +2497,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
timeout = GET_SOCKET_TIMEOUT(sock);
has_timeout = (timeout > 0);
if (has_timeout)
- deadline = _PyTime_GetMonotonicClock() + timeout;
+ deadline = _PyDeadline_Init(timeout);
do {
PySSL_BEGIN_ALLOW_THREADS
@@ -2506,8 +2509,9 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
if (PyErr_CheckSignals())
goto error;
- if (has_timeout)
- timeout = deadline - _PyTime_GetMonotonicClock();
+ if (has_timeout) {
+ timeout = _PyDeadline_Get(deadline);
+ }
if (err.ssl == SSL_ERROR_WANT_READ) {
sockstate = PySSL_select(sock, 0, timeout);
@@ -2592,8 +2596,9 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self)
timeout = GET_SOCKET_TIMEOUT(sock);
has_timeout = (timeout > 0);
- if (has_timeout)
- deadline = _PyTime_GetMonotonicClock() + timeout;
+ if (has_timeout) {
+ deadline = _PyDeadline_Init(timeout);
+ }
while (1) {
PySSL_BEGIN_ALLOW_THREADS
@@ -2626,8 +2631,9 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self)
continue;
}
- if (has_timeout)
- timeout = deadline - _PyTime_GetMonotonicClock();
+ if (has_timeout) {
+ timeout = _PyDeadline_Get(deadline);
+ }
/* Possibly retry shutdown until timeout or failure */
if (err.ssl == SSL_ERROR_WANT_READ)