cpython: 87bbe810e4e7 (original) (raw)
Mercurial > cpython
changeset 87954:87bbe810e4e7 3.3
Issue #17919: Fixed integer overflow in the eventmask parameter. [#17919]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Sat, 14 Dec 2013 19:12:02 +0200 |
parents | b9a7b2973dd6 |
children | 2fbb3c77f157 35f6a5937a63 |
files | Lib/test/test_devpoll.py Lib/test/test_poll.py Misc/NEWS Modules/selectmodule.c |
diffstat | 4 files changed, 50 insertions(+), 17 deletions(-)[+] [-] Lib/test/test_devpoll.py 11 Lib/test/test_poll.py 13 Misc/NEWS 3 Modules/selectmodule.c 40 |
line wrap: on
line diff
--- a/Lib/test/test_devpoll.py +++ b/Lib/test/test_devpoll.py @@ -87,6 +87,17 @@ class DevPollTests(unittest.TestCase): self.assertRaises(OverflowError, pollster.poll, 1 << 63) self.assertRaises(OverflowError, pollster.poll, 1 << 64)
- def test_events_mask_overflow(self):
pollster = select.devpoll()[](#l1.8)
w, r = os.pipe()[](#l1.9)
pollster.register(w)[](#l1.10)
# Issue #17919[](#l1.11)
self.assertRaises(OverflowError, pollster.register, 0, -1)[](#l1.12)
self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)[](#l1.13)
self.assertRaises(OverflowError, pollster.modify, 1, -1)[](#l1.14)
self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)[](#l1.15)
+ + def test_main(): run_unittest(DevPollTests)
--- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -3,7 +3,7 @@ import os import random import select -import _testcapi +from _testcapi import USHRT_MAX, INT_MAX, UINT_MAX try: import threading except ImportError: @@ -159,10 +159,13 @@ class PollTests(unittest.TestCase): if x != 5: self.fail('Overflow must have occurred')
pollster = select.poll()[](#l2.16)
# Issue 15989[](#l2.17)
self.assertRaises(OverflowError, pollster.poll, _testcapi.INT_MAX + 1)[](#l2.18)
self.assertRaises(OverflowError, pollster.poll, _testcapi.UINT_MAX + 1)[](#l2.19)
# Issues #15989, #17919[](#l2.20)
self.assertRaises(OverflowError, pollster.register, 0, -1)[](#l2.21)
self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)[](#l2.22)
self.assertRaises(OverflowError, pollster.modify, 1, -1)[](#l2.23)
self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)[](#l2.24)
self.assertRaises(OverflowError, pollster.poll, INT_MAX + 1)[](#l2.25)
self.assertRaises(OverflowError, pollster.poll, UINT_MAX + 1)[](#l2.26)
@unittest.skipUnless(threading, 'Threading required for this test.') @reap_threads
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,7 +32,8 @@ Core and Builtins Library ------- -- Issue #17919: select.poll.poll() again works with poll.POLLNVAL on AIX. +- Issue #17919: select.poll.register() again works with poll.POLLNVAL on AIX.
- Issue #19063: if a Charset's body_encoding was set to None, the email package would generate a message claiming the Content-Transfer-Encoding
--- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -361,7 +361,7 @@ update_ufd_array(pollObject self) assert(i < self->ufd_len); / Never overflow */ self->ufds[i].fd = (int)PyLong_AsLong(key);
self->ufds[i].events = (short)PyLong_AsLong(value);[](#l4.7)
} assert(i == self->ufd_len); @@ -369,6 +369,24 @@ update_ufd_array(pollObject *self) return 1; } +static int +ushort_converter(PyObject *obj, void *ptr) +{self->ufds[i].events = (short)(unsigned short)PyLong_AsLong(value);[](#l4.8) i++;[](#l4.9)
- unsigned long uval;
- uval = PyLong_AsUnsignedLong(obj);
- if (uval == (unsigned long)-1 && PyErr_Occurred())
return 0;[](#l4.23)
- if (uval > USHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,[](#l4.25)
"Python int too large for C unsigned short");[](#l4.26)
return 0;[](#l4.27)
- }
+} + PyDoc_STRVAR(poll_register_doc, "register(fd [, eventmask] ) -> None\n\n[](#l4.35) Register a file descriptor with the polling object.\n[](#l4.36) @@ -380,12 +398,12 @@ static PyObject * poll_register(pollObject *self, PyObject *args) { PyObject *o, *key, *value;
fd = PyObject_AsFileDescriptor(o); if (fd == -1) return NULL; @@ -423,12 +441,12 @@ static PyObject * poll_modify(pollObject *self, PyObject *args) { PyObject *o, *key, *value;
fd = PyObject_AsFileDescriptor(o); if (fd == -1) return NULL; @@ -726,11 +744,11 @@ static PyObject * internal_devpoll_register(devpollObject *self, PyObject *args, int remove) { PyObject *o;
fd = PyObject_AsFileDescriptor(o); if (fd == -1) return NULL; @@ -746,7 +764,7 @@ internal_devpoll_register(devpollObject } self->fds[self->n_fds].fd = fd;
if (++self->n_fds == self->max_n_fds) { if (devpoll_flush(self))