From: Riccardo Coccioli Date: Wed, 18 Oct 2017 12:04:04 +0000 (+0200) Subject: [2.7] bpo-31334: Fix timeout in select.poll.poll() (GH-3277) (#4034) X-Git-Tag: v2.7.15rc1~163 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27b951c63353345cdf7a9a8c4c8133a5dafd6a80;p=python [2.7] bpo-31334: Fix timeout in select.poll.poll() (GH-3277) (#4034) Always pass -1, or INFTIM where defined, to the poll() system call when a negative timeout is passed to the poll.poll([timeout]) method in the select module. Various OSes throw an error with arbitrary negative values.. (cherry picked from commit 6cfa927ceb931ad968b5b03e4a2bffb64a8a0604) --- diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index 14dbfcf47b..7ad693d319 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -208,7 +208,7 @@ class PollTests(unittest.TestCase): @unittest.skipUnless(threading, 'Threading required for this test.') @reap_threads def test_poll_blocks_with_negative_ms(self): - for timeout_ms in [None, -1, -1.0]: + for timeout_ms in [None, -1000, -1, -1.0]: # Create two file descriptors. This will be used to unlock # the blocking call to poll.poll inside the thread r, w = os.pipe() diff --git a/Misc/ACKS b/Misc/ACKS index 688cd470d2..e076c32b14 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -262,6 +262,7 @@ Brad Clements Robbie Clemons Steve Clift Hervé Coatanhay +Riccardo Coccioli Nick Coghlan Josh Cogliati Dave Cole diff --git a/Misc/NEWS.d/next/Library/2017-09-04-00-22-31.bpo-31334.9WYRfi.rst b/Misc/NEWS.d/next/Library/2017-09-04-00-22-31.bpo-31334.9WYRfi.rst new file mode 100644 index 0000000000..1cbfd2531b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-04-00-22-31.bpo-31334.9WYRfi.rst @@ -0,0 +1,3 @@ +Fix ``poll.poll([timeout])`` in the ``select`` module for arbitrary negative +timeouts on all OSes where it can only be a non-negative integer or -1. +Patch by Riccardo Coccioli. diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index a38aa08798..ce4c15b694 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -530,6 +530,17 @@ poll_poll(pollObject *self, PyObject *args) return NULL; } + /* On some OSes, typically BSD-based ones, the timeout parameter of the + poll() syscall, when negative, must be exactly INFTIM, where defined, + or -1. See issue 31334. */ + if (timeout < 0) { +#ifdef INFTIM + timeout = INFTIM; +#else + timeout = -1; +#endif + } + /* Avoid concurrent poll() invocation, issue 8865 */ if (self->poll_running) { PyErr_SetString(PyExc_RuntimeError,