diff options
author | Yury Selivanov <yury@magic.io> | 2016-10-06 14:03:03 -0400 |
---|---|---|
committer | Yury Selivanov <yury@magic.io> | 2016-10-06 14:03:03 -0400 |
commit | cb9424f6435cf02ba913d0263d69524bcc294095 (patch) | |
tree | 2aa10f72bab55e98814228a9b77e0e824abdc85d /Lib/selectors.py | |
parent | 26d998cfdd1f843a154e5398d09c0270fa17aa30 (diff) | |
download | cpython-git-cb9424f6435cf02ba913d0263d69524bcc294095.tar.gz |
Issue #27759: Fix selectors incorrectly retain invalid file descriptors.
(Backported to 3.4 as this bug might be exploited to for DoS)
Diffstat (limited to 'Lib/selectors.py')
-rw-r--r-- | Lib/selectors.py | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/Lib/selectors.py b/Lib/selectors.py index 7b6da29863..8936ab665c 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -399,7 +399,11 @@ if hasattr(select, 'epoll'): epoll_events |= select.EPOLLIN if events & EVENT_WRITE: epoll_events |= select.EPOLLOUT - self._epoll.register(key.fd, epoll_events) + try: + self._epoll.register(key.fd, epoll_events) + except BaseException: + super().unregister(fileobj) + raise return key def unregister(self, fileobj): @@ -465,14 +469,18 @@ if hasattr(select, 'kqueue'): def register(self, fileobj, events, data=None): key = super().register(fileobj, events, data) - if events & EVENT_READ: - kev = select.kevent(key.fd, select.KQ_FILTER_READ, - select.KQ_EV_ADD) - self._kqueue.control([kev], 0, 0) - if events & EVENT_WRITE: - kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, - select.KQ_EV_ADD) - self._kqueue.control([kev], 0, 0) + try: + if events & EVENT_READ: + kev = select.kevent(key.fd, select.KQ_FILTER_READ, + select.KQ_EV_ADD) + self._kqueue.control([kev], 0, 0) + if events & EVENT_WRITE: + kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + self._kqueue.control([kev], 0, 0) + except BaseException: + super().unregister(fileobj) + raise return key def unregister(self, fileobj): |