diff options
author | Steve Dower <steve.dower@microsoft.com> | 2015-03-02 16:05:27 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2015-03-02 16:05:27 (GMT) |
commit | 3f9e381030a93651a27ed4c12708fcfee1a48605 (patch) | |
tree | f08f0558c134ca11f679786b6998b66bfb37e1ce /Lib/multiprocessing | |
parent | bdf525b77c00d8fad4f713e4f00c245bbfef1ec8 (diff) | |
download | cpython-3f9e381030a93651a27ed4c12708fcfee1a48605.zip cpython-3f9e381030a93651a27ed4c12708fcfee1a48605.tar.gz cpython-3f9e381030a93651a27ed4c12708fcfee1a48605.tar.bz2 |
Issue #18382: Zero-length messages are consumed by ReadFile on Windows 8 and later
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r-- | Lib/multiprocessing/connection.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 87117d9..d2715c2 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -844,7 +844,7 @@ if sys.platform == 'win32': try: ov, err = _winapi.ReadFile(fileno(), 0, True) except OSError as e: - err = e.winerror + ov, err = None, e.winerror if err not in _ready_errors: raise if err == _winapi.ERROR_IO_PENDING: @@ -853,7 +853,16 @@ if sys.platform == 'win32': else: # If o.fileno() is an overlapped pipe handle and # err == 0 then there is a zero length message - # in the pipe, but it HAS NOT been consumed. + # in the pipe, but it HAS NOT been consumed... + if ov and sys.getwindowsversion()[:2] >= (6, 2): + # ... except on Windows 8 and later, where + # the message HAS been consumed. + try: + _, err = ov.GetOverlappedResult(False) + except OSError as e: + err = e.winerror + if not err and hasattr(o, '_got_empty_message'): + o._got_empty_message = True ready_objects.add(o) timeout = 0 |