]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #17919: Fixed integer overflow in the eventmask parameter.
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 14 Dec 2013 17:18:39 +0000 (19:18 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 14 Dec 2013 17:18:39 +0000 (19:18 +0200)
1  2 
Lib/test/test_devpoll.py
Lib/test/test_poll.py
Misc/NEWS
Modules/selectmodule.c

index 40ebeee5975b65d1856bc572f1e671bb510251c9,c7bacf89a215670ce12a9c169cfd2a91adaa8713..bd0db6166455c149781d12cc8ce5eab1be0ca4a8
@@@ -91,36 -87,17 +91,47 @@@ class DevPollTests(unittest.TestCase)
          self.assertRaises(OverflowError, pollster.poll, 1 << 63)
          self.assertRaises(OverflowError, pollster.poll, 1 << 64)
  
 +    def test_close(self):
 +        open_file = open(__file__, "rb")
 +        self.addCleanup(open_file.close)
 +        fd = open_file.fileno()
 +        devpoll = select.devpoll()
 +
 +        # test fileno() method and closed attribute
 +        self.assertIsInstance(devpoll.fileno(), int)
 +        self.assertFalse(devpoll.closed)
 +
 +        # test close()
 +        devpoll.close()
 +        self.assertTrue(devpoll.closed)
 +        self.assertRaises(ValueError, devpoll.fileno)
 +
 +        # close() can be called more than once
 +        devpoll.close()
 +
 +        # operations must fail with ValueError("I/O operation on closed ...")
 +        self.assertRaises(ValueError, devpoll.modify, fd, select.POLLIN)
 +        self.assertRaises(ValueError, devpoll.poll)
 +        self.assertRaises(ValueError, devpoll.register, fd, fd, select.POLLIN)
 +        self.assertRaises(ValueError, devpoll.unregister, fd)
 +
 +    def test_fd_non_inheritable(self):
 +        devpoll = select.devpoll()
 +        self.addCleanup(devpoll.close)
 +        self.assertEqual(os.get_inheritable(devpoll.fileno()), False)
 +
 +
+     def test_events_mask_overflow(self):
+         pollster = select.devpoll()
+         w, r = os.pipe()
+         pollster.register(w)
+         # Issue #17919
+         self.assertRaises(OverflowError, pollster.register, 0, -1)
+         self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)
+         self.assertRaises(OverflowError, pollster.modify, 1, -1)
+         self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)
  def test_main():
      run_unittest(DevPollTests)
  
index 8138294164d7cf774e2641da2dd34c9610d870ac,3c86ef639f69f60e8159c3e0ea54d630a2fc94ab..41ca803e4a241edb891cb7cc4971283ff2717453
@@@ -1,10 -1,9 +1,10 @@@
  # Test case for the os.poll() function
  
  import os
 +import subprocess
  import random
  import select
- import _testcapi
+ from _testcapi import USHRT_MAX, INT_MAX, UINT_MAX
  try:
      import threading
  except ImportError:
diff --cc Misc/NEWS
index 93b9dd6884db65ee008cd58da04339ba6ecd12cf,b5f1ece6a68c61a061925c97386b7df619d6048a..95f77527884f07e16db1e61b058370bb85cbe42f
+++ b/Misc/NEWS
@@@ -44,10 -32,8 +44,11 @@@ Core and Builtin
  Library
  -------
  
- - Issue #17919: select.poll.poll() again works with poll.POLLNVAL on AIX.
 +- Issue #19946: multiprocessing.spawn now raises ImportError when the module to
 +  be used as the main module cannot be imported.
 +
+ - Issue #17919: select.poll.register() again works with poll.POLLNVAL on AIX.
+   Fixed integer overflow in the eventmask parameter.
  
  - Issue #19063: if a Charset's body_encoding was set to None, the email
    package would generate a message claiming the Content-Transfer-Encoding
index 1e7ba4c147e89a0d0a7ad0b1df948ec7bd622a18,c492224ecbcf32a4172f6ac4502b2cde220ca1ad..0293c8b47b25bdd8aa12301b3346fba267ff910f
@@@ -728,14 -744,11 +746,14 @@@ static PyObject 
  internal_devpoll_register(devpollObject *self, PyObject *args, int remove)
  {
      PyObject *o;
-     int fd, events = POLLIN | POLLPRI | POLLOUT;
+     int fd;
+     unsigned short events = POLLIN | POLLPRI | POLLOUT;
  
-     if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
 +    if (self->fd_devpoll < 0)
 +        return devpoll_err_closed();
 +
+     if (!PyArg_ParseTuple(args, "O|O&:register", &o, ushort_converter, &events))
          return NULL;
-     }
  
      fd = PyObject_AsFileDescriptor(o);
      if (fd == -1) return NULL;