(svn r8000) -Codechange: drop UDP packets when their internal size does not match the received size. If that is the case, the packet was not received in one piece (or got somehow mangled with another packet), which will cause us to drop the packet later on because we are (for example) trying to read beyond the end of the packet.
authorrubidium
Tue, 09 Jan 2007 14:48:21 +0000
changeset 5823 7cd91e6e5c71
parent 5822 d3cb74db65ff
child 5824 49420056ec89
(svn r8000) -Codechange: drop UDP packets when their internal size does not match the received size. If that is the case, the packet was not received in one piece (or got somehow mangled with another packet), which will cause us to drop the packet later on because we are (for example) trying to read beyond the end of the packet.
src/network/core/udp.c
--- a/src/network/core/udp.c	Tue Jan 09 07:24:35 2007 +0000
+++ b/src/network/core/udp.c	Tue Jan 09 14:48:21 2007 +0000
@@ -116,11 +116,19 @@
 	/* Try to receive anything */
 	nbytes = recvfrom(udp, p.buffer, packet_len, 0, (struct sockaddr *)&client_addr, &client_len);
 
-	/* We got some bytes for the base header of the packet.
-	 * Assume we received the whole packet. */
+	/* We got some bytes for the base header of the packet. */
 	if (nbytes > 2) {
 		NetworkRecv_ReadPacketSize(&p);
 
+		/* If the size does not match the packet must be corrupted.
+		 * Otherwise it will be marked as corrupted later on. */
+		if (nbytes != p.size) {
+			DEBUG(net, 1, "received a packet with mismatching size from %s:%d",
+					inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
+
+			return;
+		}
+
 		/* Put the position on the right place */
 		p.pos = 2;
 		p.next = NULL;