Issue #23618: Fix EINTR handling in socket.connect()

Call PyErr_CheckSignals() if connect(), select() or getsockopt() failed with
EINTR.
This commit is contained in:
Victor Stinner 2015-03-31 21:28:42 +02:00
parent c4e819a54f
commit ee699e9d2b
1 changed files with 8 additions and 10 deletions

View File

@ -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);
}