diff options
author | Riccardo Coccioli <volans-@users.noreply.github.com> | 2017-10-17 19:45:07 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2017-10-17 19:45:07 (GMT) |
commit | 6cfa927ceb931ad968b5b03e4a2bffb64a8a0604 (patch) | |
tree | 855bb4cc90ec73fbcd093d09a4df313c92850e75 /Modules | |
parent | 2c15b29aea5d6b9c61aa42d2c24a07ff1edb4b46 (diff) | |
download | cpython-6cfa927ceb931ad968b5b03e4a2bffb64a8a0604.zip cpython-6cfa927ceb931ad968b5b03e4a2bffb64a8a0604.tar.gz cpython-6cfa927ceb931ad968b5b03e4a2bffb64a8a0604.tar.bz2 |
bpo-31334: Fix timeout in select.poll.poll() (GH-3277)
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.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/selectmodule.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5305523..0f353fb 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -525,20 +525,14 @@ poll_poll(pollObject *self, PyObject *args) PyObject *result_list = NULL, *timeout_obj = NULL; int poll_result, i, j; PyObject *value = NULL, *num = NULL; - _PyTime_t timeout, ms, deadline; + _PyTime_t timeout = -1, ms = -1, deadline = 0; int async_err = 0; if (!PyArg_ParseTuple(args, "|O:poll", &timeout_obj)) { return NULL; } - /* Check values for timeout */ - if (timeout_obj == NULL || timeout_obj == Py_None) { - timeout = -1; - ms = -1; - deadline = 0; /* initialize to prevent gcc warning */ - } - else { + if (timeout_obj != NULL && timeout_obj != Py_None) { if (_PyTime_FromMillisecondsObject(&timeout, timeout_obj, _PyTime_ROUND_TIMEOUT) < 0) { if (PyErr_ExceptionMatches(PyExc_TypeError)) { @@ -554,7 +548,20 @@ poll_poll(pollObject *self, PyObject *args) return NULL; } - deadline = _PyTime_GetMonotonicClock() + timeout; + if (timeout >= 0) { + deadline = _PyTime_GetMonotonicClock() + timeout; + } + } + + /* 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 (ms < 0) { +#ifdef INFTIM + ms = INFTIM; +#else + ms = -1; +#endif } /* Avoid concurrent poll() invocation, issue 8865 */ |