mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #27759: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.
This commit is contained in:
parent
d6c6771fc9
commit
525aedc5fa
3 changed files with 43 additions and 9 deletions
|
@ -9,6 +9,7 @@ from test import support
|
|||
from time import sleep
|
||||
import unittest
|
||||
import unittest.mock
|
||||
import tempfile
|
||||
from time import monotonic as time
|
||||
try:
|
||||
import resource
|
||||
|
@ -475,6 +476,16 @@ class EpollSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn):
|
|||
|
||||
SELECTOR = getattr(selectors, 'EpollSelector', None)
|
||||
|
||||
def test_register_file(self):
|
||||
# epoll(7) returns EPERM when given a file to watch
|
||||
s = self.SELECTOR()
|
||||
with tempfile.NamedTemporaryFile() as f:
|
||||
with self.assertRaises(IOError):
|
||||
s.register(f, selectors.EVENT_READ)
|
||||
# the SelectorKey has been removed
|
||||
with self.assertRaises(KeyError):
|
||||
s.get_key(f)
|
||||
|
||||
|
||||
@unittest.skipUnless(hasattr(selectors, 'KqueueSelector'),
|
||||
"Test needs selectors.KqueueSelector)")
|
||||
|
@ -482,6 +493,18 @@ class KqueueSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn):
|
|||
|
||||
SELECTOR = getattr(selectors, 'KqueueSelector', None)
|
||||
|
||||
def test_register_bad_fd(self):
|
||||
# a file descriptor that's been closed should raise an OSError
|
||||
# with EBADF
|
||||
s = self.SELECTOR()
|
||||
bad_f = support.make_bad_fd()
|
||||
with self.assertRaises(OSError) as cm:
|
||||
s.register(bad_f, selectors.EVENT_READ)
|
||||
self.assertEqual(cm.exception.errno, errno.EBADF)
|
||||
# the SelectorKey has been removed
|
||||
with self.assertRaises(KeyError):
|
||||
s.get_key(bad_f)
|
||||
|
||||
|
||||
@unittest.skipUnless(hasattr(selectors, 'DevpollSelector'),
|
||||
"Test needs selectors.DevpollSelector")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue