[Python-checkins] [2.7] bpo-31334: Fix timeout in select.poll.poll() (GH-3277) (#4034)
Serhiy Storchaka
webhook-mailer at python.org
Wed Oct 18 08:04:09 EDT 2017
https://github.com/python/cpython/commit/27b951c63353345cdf7a9a8c4c8133a5dafd6a80
commit: 27b951c63353345cdf7a9a8c4c8133a5dafd6a80
branch: 2.7
author: Riccardo Coccioli <volans- at users.noreply.github.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2017-10-18T15:04:04+03:00
summary:
[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)
files:
A Misc/NEWS.d/next/Library/2017-09-04-00-22-31.bpo-31334.9WYRfi.rst
M Lib/test/test_poll.py
M Misc/ACKS
M Modules/selectmodule.c
diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py
index 14dbfcf47b2..7ad693d319f 100644
--- a/Lib/test/test_poll.py
+++ b/Lib/test/test_poll.py
@@ -208,7 +208,7 @@ def test_threaded_poll(self):
@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 688cd470d20..e076c32b14d 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 00000000000..1cbfd2531bc
--- /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 a38aa08798c..ce4c15b6946 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,
More information about the Python-checkins
mailing list