Issue #27759: Fix selectors incorrectly retain invalid file descriptors.

Patch by Mark Williams.
This commit is contained in:
Yury Selivanov 2016-09-15 19:30:42 -04:00
parent d6c6771fc9
commit 525aedc5fa
3 changed files with 43 additions and 9 deletions

View file

@ -408,7 +408,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):
@ -530,14 +534,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):