diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2024-03-25 10:21:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 10:21:31 (GMT) |
commit | bd2c60f8c2a6664b353dbaee8ae0eddc55d1ffb8 (patch) | |
tree | febfe6de0a501ce3ab40254f15ffd9440ff82929 /Lib/asyncio/windows_events.py | |
parent | 193a24bb80fb6a73a2f9ff52bdc14ea597aa1fe3 (diff) | |
download | cpython-bd2c60f8c2a6664b353dbaee8ae0eddc55d1ffb8.zip cpython-bd2c60f8c2a6664b353dbaee8ae0eddc55d1ffb8.tar.gz cpython-bd2c60f8c2a6664b353dbaee8ae0eddc55d1ffb8.tar.bz2 |
[3.12] gh-91227: Ignore ERROR_PORT_UNREACHABLE in proactor recvfrom() (GH-32011) (GH-117209)
(cherry picked from commit f11d0d8be8af28e1368c3c7c116218cf65ddf93e)
Co-authored-by: Erik Soma <stillusingirc@gmail.com>
Diffstat (limited to 'Lib/asyncio/windows_events.py')
-rw-r--r-- | Lib/asyncio/windows_events.py | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index c71f401..cb61345 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -8,6 +8,7 @@ if sys.platform != 'win32': # pragma: no cover import _overlapped import _winapi import errno +from functools import partial import math import msvcrt import socket @@ -466,6 +467,18 @@ class IocpProactor: else: raise + @classmethod + def _finish_recvfrom(cls, trans, key, ov, *, empty_result): + try: + return cls.finish_socket_func(trans, key, ov) + except OSError as exc: + # WSARecvFrom will report ERROR_PORT_UNREACHABLE when the same + # socket is used to send to an address that is not listening. + if exc.winerror == _overlapped.ERROR_PORT_UNREACHABLE: + return empty_result, None + else: + raise + def recv(self, conn, nbytes, flags=0): self._register_with_iocp(conn) ov = _overlapped.Overlapped(NULL) @@ -500,7 +513,8 @@ class IocpProactor: except BrokenPipeError: return self._result((b'', None)) - return self._register(ov, conn, self.finish_socket_func) + return self._register(ov, conn, partial(self._finish_recvfrom, + empty_result=b'')) def recvfrom_into(self, conn, buf, flags=0): self._register_with_iocp(conn) @@ -510,17 +524,8 @@ class IocpProactor: except BrokenPipeError: return self._result((0, None)) - def finish_recv(trans, key, ov): - try: - return ov.getresult() - except OSError as exc: - if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, - _overlapped.ERROR_OPERATION_ABORTED): - raise ConnectionResetError(*exc.args) - else: - raise - - return self._register(ov, conn, finish_recv) + return self._register(ov, conn, partial(self._finish_recvfrom, + empty_result=0)) def sendto(self, conn, buf, flags=0, addr=None): self._register_with_iocp(conn) |