8000 gh-91227: Ignore ERROR_PORT_UNREACHABLE by esoma · Pull Request #32011 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-91227: Ignore ERROR_PORT_UNREACHABLE #32011

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Mar 23, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Formatting.
  • Loading branch information
esoma committed Mar 23, 2024
commit a6915cd53d44f71359f0642c129a24f5bd4cee7a
11 changes: 6 additions & 5 deletions Lib/asyncio/windows_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,8 @@ 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.
# 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:
Expand Down Expand Up @@ -515,7 +514,8 @@ def recvfrom(self, conn, nbytes, flags=0):
except BrokenPipeError:
return self._result((b'', None))

return self._register(ov, conn, partial(self._finish_recvfrom, empty_result=b''))
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)
Expand All @@ -525,7 +525,8 @@ def recvfrom_into(self, conn, buf, flags=0):
except BrokenPipeError:
return self._result((0, None))

return self._register(ov, conn, partial(self._finish_recvfrom, empty_result=0))
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)
Expand Down
24 changes: 14 additions & 10 deletions Lib/test/test_asyncio/test_sock_lowlevel.py
Original file line number Diff line number Diff line change
Expand Up @@ -563,15 +563,16 @@ def create_event_loop(self):
return asyncio.ProactorEventLoop()


async def _basetest_datagram_send_to_non_listening_address(self, recvfrom):
async def _basetest_datagram_send_to_non_listening_address(self,
recvfrom):
await asyncio.sleep(0)
# see:
# https://github.com/python/cpython/issues/91227
# https://github.com/python/cpython/issues/88906
# https://bugs.python.org/issue47071
# https://bugs.python.org/issue44743
# The Proactor event loop would fail to receive datagram messages after
# sending a message to an address that wasn't listening.
# The Proactor event loop would fail to receive datagram messages
# after sending a message to an address that wasn't listening.

def create_socket():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Expand All @@ -585,8 +586,8 @@ def create_socket():
socket_2 = create_socket()
addr_2 = socket_2.getsockname()

# creating and immediately closing this to try to get an address that
# is not listening
# creating and immediately closing this to try to get an address
# that is not listening
socket_3 = create_socket()
addr_3 = socket_3.getsockname()
socket_3.shutdown(socket.SHUT_RDWR)
Expand All @@ -610,8 +611,8 @@ def create_socket():
socket_1_recv_task = self.loop.create_task(recvfrom(socket_1))
await asyncio.sleep(0)

# socket 1 should still be able to receive messages after sending to
# an address that wasn't listening
# socket 1 should still be able to receive messages after sending
# to an address that wasn't listening
socket_2.sendto(b'd', addr_1)
self.assertEqual(await socket_1_recv_task, b'd')

Expand All @@ -627,17 +628,20 @@ async def recvfrom(socket):
return data

self.loop.run_until_complete(
self._basetest_datagram_send_to_non_listening_address(recvfrom))
self._basetest_datagram_send_to_non_listening_address(
recvfrom))


def test_datagram_send_to_non_listening_address_recvfrom_into(self):
async def recvfrom_into(socket):
buf = bytearray(4096)
length, _ = await self.loop.sock_recvfrom_into(socket, buf, 4096)
length, _ = await self.loop.sock_recvfrom_into(socket, buf,
4096)
return buf[:length]

self.loop.run_until_complete(
self._basetest_datagram_send_to_non_listening_address(recvfrom_into))
self._basetest_datagram_send_to_non_listening_address(
recvfrom_into))

else:
import selectors
Expand Down
0