summaryrefslogtreecommitdiff
path: root/src/network/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/core')
-rw-r--r--src/network/core/udp.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp
index 4a0029eed..4c74af3f6 100644
--- a/src/network/core/udp.cpp
+++ b/src/network/core/udp.cpp
@@ -117,18 +117,21 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a
void NetworkUDPSocketHandler::ReceivePackets()
{
for (SocketList::iterator s = this->sockets.Begin(); s != this->sockets.End(); s++) {
- struct sockaddr_storage client_addr;
- memset(&client_addr, 0, sizeof(client_addr));
+ for (int i = 0; i < 1000; i++) { // Do not infinitely loop when DoSing with UDP
+ struct sockaddr_storage client_addr;
+ memset(&client_addr, 0, sizeof(client_addr));
- Packet p(this);
- socklen_t client_len = sizeof(client_addr);
+ Packet p(this);
+ socklen_t client_len = sizeof(client_addr);
- /* Try to receive anything */
- SetNonBlocking(s->second); // Some OSes seem to lose the non-blocking status of the socket
- int nbytes = recvfrom(s->second, (char*)p.buffer, SEND_MTU, 0, (struct sockaddr *)&client_addr, &client_len);
+ /* Try to receive anything */
+ SetNonBlocking(s->second); // Some OSes seem to lose the non-blocking status of the socket
+ int nbytes = recvfrom(s->second, (char*)p.buffer, SEND_MTU, 0, (struct sockaddr *)&client_addr, &client_len);
+
+ /* Did we get the bytes for the base header of the packet? */
+ if (nbytes <= 0) break; // No data, i.e. no packet
+ if (nbytes <= 2) continue; // Invalid data; try next packet
- /* We got some bytes for the base header of the packet. */
- if (nbytes > 2) {
NetworkAddress address(client_addr, client_len);
p.PrepareToRead();
@@ -136,7 +139,7 @@ void NetworkUDPSocketHandler::ReceivePackets()
* Otherwise it will be marked as corrupted later on. */
if (nbytes != p.size) {
DEBUG(net, 1, "received a packet with mismatching size from %s", address.GetAddressAsString());
- return;
+ continue;
}
/* Handle the packet */