From: Richard Oudkerk Date: Sun, 24 Nov 2013 17:50:40 +0000 (+0000) Subject: Issue #19740: Use WaitForSingleObject() instead of trusting TimerOrWaitFired. X-Git-Tag: v3.4.0b2~507^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71196e7f558412ec6465eba9cb8dc147428296d9;p=thirdparty%2FPython%2Fcpython.git Issue #19740: Use WaitForSingleObject() instead of trusting TimerOrWaitFired. --- diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 64fe38617d74..b2ed2415e4ba 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -327,14 +327,21 @@ class IocpProactor: handle, self._iocp, ov.address, ms) f = _WaitHandleFuture(wh, loop=self._loop) - def finish(timed_out, _, ov): + def finish(trans, key, ov): if not f.cancelled(): try: _overlapped.UnregisterWait(wh) except OSError as e: if e.winerror != _overlapped.ERROR_IO_PENDING: raise - return not timed_out + # Note that this second wait means that we should only use + # this with handles types where a successful wait has no + # effect. So events or processes are all right, but locks + # or semaphores are not. Also note if the handle is + # signalled and then quickly reset, then we may return + # False even though we have not timed out. + return (_winapi.WaitForSingleObject(handle, 0) == + _winapi.WAIT_OBJECT_0) self._cache[ov.address] = (f, ov, None, finish) return f