Issue #23618: Fix EINTR handling in socket.connect()
Call PyErr_CheckSignals() if connect(), select() or getsockopt() failed with EINTR.
This commit is contained in:
parent
c4e819a54f
commit
ee699e9d2b
|
@ -2502,6 +2502,9 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
|
|||
}
|
||||
*timeoutp = timeout;
|
||||
|
||||
if (err == EINTR && PyErr_CheckSignals())
|
||||
return -1;
|
||||
|
||||
assert(err >= 0);
|
||||
return err;
|
||||
|
||||
|
@ -2524,13 +2527,14 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
|
|||
return NULL;
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
|
||||
if (res < 0)
|
||||
return NULL;
|
||||
|
||||
if (timeout == 1) {
|
||||
PyErr_SetString(socket_timeout, "timed out");
|
||||
return NULL;
|
||||
}
|
||||
if (res < 0)
|
||||
return NULL;
|
||||
|
||||
if (res != 0) {
|
||||
#ifdef MS_WINDOWS
|
||||
WSASetLastError(res);
|
||||
|
@ -2539,8 +2543,8 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
|
|||
#endif
|
||||
return s->errorhandler();
|
||||
}
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(connect_doc,
|
||||
|
@ -2564,15 +2568,9 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro)
|
|||
return NULL;
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
|
||||
|
||||
if (res < 0)
|
||||
return NULL;
|
||||
|
||||
/* Signals are not errors (though they may raise exceptions). Adapted
|
||||
from PyErr_SetFromErrnoWithFilenameObject(). */
|
||||
if (res == EINTR && PyErr_CheckSignals())
|
||||
return NULL;
|
||||
|
||||
return PyLong_FromLong((long) res);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue