diff --git a/Lib/selectors.py b/Lib/selectors.py index edde22c634b..f8b17a14f94 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -387,7 +387,7 @@ class _PollLikeSelector(_BaseSelectorImpl): selector_events |= self._EVENT_WRITE try: self._selector.modify(key.fd, selector_events) - except Exception: + except: super().unregister(fileobj) raise changed = True @@ -524,7 +524,7 @@ if hasattr(select, 'kqueue'): kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD) self._selector.control([kev], 0, 0) - except Exception: + except: super().unregister(fileobj) raise return key diff --git a/Misc/NEWS b/Misc/NEWS index 20cea471a66..33333260311 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -350,6 +350,10 @@ Extension Modules Library ------- +- bpo-30624: selectors does not take KeyboardInterrupt and SystemExit into + account, leaving a fd in a bad state in case of error. Patch by Giampaolo + Rodola'. + - bpo-30595: multiprocessing.Queue.get() with a timeout now polls its reader in non-blocking mode if it succeeded to aquire the lock but the acquire took longer than the timeout.