From c8450d4d0ce8b6d51a9bd74cdaf25f5179657f41 Mon Sep 17 00:00:00 2001 From: dmiller Date: Wed, 7 Oct 2020 21:56:28 +0000 Subject: [PATCH] Handle a weird IOCP error for UDP sockets. Fixes #2140 --- nsock/src/engine_iocp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nsock/src/engine_iocp.c b/nsock/src/engine_iocp.c index 39f27b312..311708373 100644 --- a/nsock/src/engine_iocp.c +++ b/nsock/src/engine_iocp.c @@ -617,7 +617,9 @@ static void call_read_overlapped(struct nevent *nse) { if (err) { err = socket_errno(); if (errcode_is_failure(err)) { - eov->err = err; + // WSARecvFrom with overlapped I/O may generate ERROR_PORT_UNREACHABLE on ICMP error. + // We'll translate that so Nsock-using software doesn't have to know about it. + eov->err = (err == ERROR_PORT_UNREACHABLE ? ECONNREFUSED : err); /* Send the error to the main loop to be picked up by the appropriate handler */ BOOL bRet = PostQueuedCompletionStatus(iinfo->iocp, -1, (ULONG_PTR)nse->iod, (LPOVERLAPPED)eov); if (!bRet)