mirror of
https://git.code.sf.net/p/quake/nuq
synced 2024-11-21 19:51:09 +00:00
fix the 0 byte udp packet DoS bug (for linux, anyway: mods from ProQuake
applied for windows, but I can't test). In, linux, the problem was caused by nuq checking to see if there were any bytes to be read and if there were 0 bytes, just carying on without reading anything. It seems that the 0 byte packet was blocking the queue and so a 0 byte recvfrom is needed to make sure it gets removed.
This commit is contained in:
parent
9a53a2d328
commit
c8483de74f
3 changed files with 6 additions and 2 deletions
|
@ -262,7 +262,7 @@ int MPATH_CheckNewConnections (void)
|
||||||
if (net_acceptsocket == -1)
|
if (net_acceptsocket == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (recvfrom (net_acceptsocket, buf, 4, MSG_PEEK, NULL, NULL) > 0)
|
if (recvfrom (net_acceptsocket, buf, 4, MSG_PEEK, NULL, NULL) >= 0)
|
||||||
return net_acceptsocket;
|
return net_acceptsocket;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,6 +248,9 @@ int UDP_Connect (int socket, struct qsockaddr *addr)
|
||||||
int UDP_CheckNewConnections (void)
|
int UDP_CheckNewConnections (void)
|
||||||
{
|
{
|
||||||
unsigned long available;
|
unsigned long available;
|
||||||
|
struct sockaddr_in from;
|
||||||
|
socklen_t fromlen;
|
||||||
|
char buff[1];
|
||||||
|
|
||||||
if (net_acceptsocket == -1)
|
if (net_acceptsocket == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -256,6 +259,7 @@ int UDP_CheckNewConnections (void)
|
||||||
Sys_Error ("UDP: ioctlsocket (FIONREAD) failed\n");
|
Sys_Error ("UDP: ioctlsocket (FIONREAD) failed\n");
|
||||||
if (available)
|
if (available)
|
||||||
return net_acceptsocket;
|
return net_acceptsocket;
|
||||||
|
recvfrom (net_acceptsocket, buff, 0, 0, &from, &fromlen);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -393,7 +393,7 @@ int WINS_CheckNewConnections (void)
|
||||||
if (net_acceptsocket == -1)
|
if (net_acceptsocket == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (precvfrom (net_acceptsocket, buf, sizeof(buf), MSG_PEEK, NULL, NULL) > 0)
|
if (precvfrom (net_acceptsocket, buf, sizeof(buf), MSG_PEEK, NULL, NULL) >= 0)
|
||||||
{
|
{
|
||||||
return net_acceptsocket;
|
return net_acceptsocket;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue