]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35310: Clear select() lists before returning upon EINTR (GH-10877)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 5 Dec 2018 21:31:07 +0000 (13:31 -0800)
committerGitHub <noreply@github.com>
Wed, 5 Dec 2018 21:31:07 +0000 (13:31 -0800)
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.
(cherry picked from commit 7f52415a6d4841d77d3b7853e83b25a22e0048dc)

Co-authored-by: Oran Avraham <252748+oranav@users.noreply.github.com>
Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst [new file with mode: 0644]
Modules/selectmodule.c

diff --git a/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst b/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst
new file mode 100644 (file)
index 0000000..1ab2e16
--- /dev/null
@@ -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.
index 63266af4dce959e5f81d366211c91af2d2b50af2..88679e81449592048eea07c3a933b2dfdf4c1bea 100644 (file)
@@ -279,6 +279,10 @@ select_select(PyObject *self, PyObject *args)
         if (tvp) {
             timeout = deadline - _PyTime_GetMonotonicClock();
             if (timeout < 0) {
+                /* bpo-35310: lists were unmodified -- clear them explicitly */
+                FD_ZERO(&ifdset);
+                FD_ZERO(&ofdset);
+                FD_ZERO(&efdset);
                 n = 0;
                 break;
             }