bpo-35310: Clear select() lists before returning upon EINTR (GH-10877)
select() calls are retried on EINTR (per PEP 475). However, if a timeout was provided and the deadline has passed after running the signal handlers, rlist, wlist and xlist should be cleared since select(2) left them unmodified.
This commit is contained in:
parent
67a93b3a0b
commit
7f52415a6d
|
@ -0,0 +1,4 @@
|
||||||
|
Fix a bug in :func:`select.select` where, in some cases, the file descriptor
|
||||||
|
sequences were returned unmodified after a signal interruption, even though the
|
||||||
|
file descriptors might not be ready yet. :func:`select.select` will now always
|
||||||
|
return empty lists if a timeout has occurred. Patch by Oran Avraham.
|
|
@ -335,6 +335,10 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist,
|
||||||
if (tvp) {
|
if (tvp) {
|
||||||
timeout = deadline - _PyTime_GetMonotonicClock();
|
timeout = deadline - _PyTime_GetMonotonicClock();
|
||||||
if (timeout < 0) {
|
if (timeout < 0) {
|
||||||
|
/* bpo-35310: lists were unmodified -- clear them explicitly */
|
||||||
|
FD_ZERO(&ifdset);
|
||||||
|
FD_ZERO(&ofdset);
|
||||||
|
FD_ZERO(&efdset);
|
||||||
n = 0;
|
n = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue