From 3b39a25adec80437e56f8a6d886d220786a889f6 Mon Sep 17 00:00:00 2001
From: Monster Iestyn <iestynjealous@ntlworld.com>
Date: Sat, 27 Oct 2018 15:49:04 +0100
Subject: [PATCH] Save the result of errno (aka WSAGetLastError() for WinSock)
 as soon as possible, to prevent anything in SOCK_GetNodeAddress resetting the
 value to 0 while trying to print the message for the error itself!

---
 src/i_tcp.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/i_tcp.c b/src/i_tcp.c
index 9febd56f01..6a21278662 100644
--- a/src/i_tcp.c
+++ b/src/i_tcp.c
@@ -781,9 +781,13 @@ static void SOCK_Send(void)
 			&clientaddress[doomcom->remotenode].any, d);
 	}
 
-	if (c == ERRSOCKET && errno != ECONNREFUSED && errno != EWOULDBLOCK)
-		I_Error("SOCK_Send, error sending to node %d (%s) #%u: %s", doomcom->remotenode,
-			SOCK_GetNodeAddress(doomcom->remotenode), errno, strerror(errno));
+	if (c == ERRSOCKET)
+	{
+		int e = errno; // save error code so it can't be modified later
+		if (e != ECONNREFUSED && e != EWOULDBLOCK)
+			I_Error("SOCK_Send, error sending to node %d (%s) #%u: %s", doomcom->remotenode,
+				SOCK_GetNodeAddress(doomcom->remotenode), e, strerror(e));
+	}
 }
 #endif
 
-- 
GitLab