Skip to content
Snippets Groups Projects
Commit 1ebac1ed authored by Alam Ed Arias's avatar Alam Ed Arias
Browse files

Avoid calling WSAGetLastError() (via errno/h_error) more then once with Winsock2

parent 4bb8183e
Branches
No related tags found
No related merge requests found
...@@ -386,6 +386,7 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk) ...@@ -386,6 +386,7 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
int v6 = 0; int v6 = 0;
#endif #endif
void *addr; void *addr;
int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
if(sk->any.sa_family == AF_INET) if(sk->any.sa_family == AF_INET)
addr = &sk->ip4.sin_addr; addr = &sk->ip4.sin_addr;
...@@ -399,7 +400,10 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk) ...@@ -399,7 +400,10 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
if(addr == NULL) if(addr == NULL)
sprintf(s, "No address"); sprintf(s, "No address");
else if(inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL) else if(inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL)
sprintf(s, "Unknown family type, error #%u", errno); {
e = errno;
sprintf(s, "Unknown family type, error #%u: %s", e, strerror(e));
}
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
else if(sk->any.sa_family == AF_INET6) else if(sk->any.sa_family == AF_INET6)
{ {
...@@ -655,6 +659,7 @@ static inline ssize_t SOCK_SendToAddr(SOCKET_TYPE socket, mysockaddr_t *sockaddr ...@@ -655,6 +659,7 @@ static inline ssize_t SOCK_SendToAddr(SOCKET_TYPE socket, mysockaddr_t *sockaddr
static void SOCK_Send(void) static void SOCK_Send(void)
{ {
ssize_t c = ERRSOCKET; ssize_t c = ERRSOCKET;
int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
if (!nodeconnected[doomcom->remotenode]) if (!nodeconnected[doomcom->remotenode])
return; return;
...@@ -668,12 +673,16 @@ static void SOCK_Send(void) ...@@ -668,12 +673,16 @@ static void SOCK_Send(void)
if (myfamily[i] == broadcastaddress[j].any.sa_family) if (myfamily[i] == broadcastaddress[j].any.sa_family)
{ {
c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]); c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]);
if (c == ERRSOCKET && !ALLOWEDERROR(errno)) if (c == ERRSOCKET)
{
e = errno;
if (!ALLOWEDERROR(e))
break; break;
} }
} }
} }
} }
}
else if (nodesocket[doomcom->remotenode] == (SOCKET_TYPE)ERRSOCKET) else if (nodesocket[doomcom->remotenode] == (SOCKET_TYPE)ERRSOCKET)
{ {
for (size_t i = 0; i < mysocketses; i++) for (size_t i = 0; i < mysocketses; i++)
...@@ -681,11 +690,15 @@ static void SOCK_Send(void) ...@@ -681,11 +690,15 @@ static void SOCK_Send(void)
if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family) if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family)
{ {
c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]); c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]);
if (c == ERRSOCKET && !ALLOWEDERROR(errno)) if (c == ERRSOCKET)
{
e = errno;
if (!ALLOWEDERROR(e))
break; break;
} }
} }
} }
}
else else
{ {
c = SOCK_SendToAddr(nodesocket[doomcom->remotenode], &clientaddress[doomcom->remotenode]); c = SOCK_SendToAddr(nodesocket[doomcom->remotenode], &clientaddress[doomcom->remotenode]);
...@@ -693,7 +706,6 @@ static void SOCK_Send(void) ...@@ -693,7 +706,6 @@ static void SOCK_Send(void)
if (c == ERRSOCKET) if (c == ERRSOCKET)
{ {
int e = errno; // save error code so it can't be modified later
if (!ALLOWEDERROR(e)) if (!ALLOWEDERROR(e))
I_Error("SOCK_Send, error sending to node %d (%s) #%u, %s", doomcom->remotenode, I_Error("SOCK_Send, error sending to node %d (%s) #%u, %s", doomcom->remotenode,
SOCK_GetNodeAddress(doomcom->remotenode), e, strerror(e)); SOCK_GetNodeAddress(doomcom->remotenode), e, strerror(e));
...@@ -727,7 +739,7 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen ...@@ -727,7 +739,7 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
SOCKET_TYPE s = socket(family, SOCK_DGRAM, IPPROTO_UDP); SOCKET_TYPE s = socket(family, SOCK_DGRAM, IPPROTO_UDP);
int opt; int opt;
int rc; int rc;
int e = 0; // save error code so it can't be modified later code int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
socklen_t opts; socklen_t opts;
#ifdef FIONBIO #ifdef FIONBIO
unsigned long trueval = true; unsigned long trueval = true;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment