diff options
Diffstat (limited to 'package/busybox')
| -rw-r--r-- | package/busybox/patches/450-truncated_ping_results.patch | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/package/busybox/patches/450-truncated_ping_results.patch b/package/busybox/patches/450-truncated_ping_results.patch new file mode 100644 index 000000000..30e86701a --- /dev/null +++ b/package/busybox/patches/450-truncated_ping_results.patch @@ -0,0 +1,42 @@ +--- busybox-1.4.1/networking/ping.c	2007-01-24 22:34:34.000000000 +0100 ++++ busybox-1.4.1.new/networking/ping.c	2007-02-28 20:35:59.000000000 +0100 +@@ -70,7 +70,7 @@ + 	struct sockaddr_in pingaddr; + 	struct icmp *pkt; + 	int pingsock, c; +-	char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; ++	char packet[datalen + MAXIPLEN + MAXICMPLEN]; +  + 	pingsock = create_icmp_socket(); +  +@@ -86,7 +86,7 @@ + 	pkt->icmp_type = ICMP_ECHO; + 	pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet)); +  +-	c = sendto(pingsock, packet, DEFDATALEN + ICMP_MINLEN, 0, ++	c = sendto(pingsock, packet, datalen + ICMP_MINLEN, 0, + 			   (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in)); +  + 	if (c < 0) { +@@ -257,8 +257,8 @@ +  + 	gettimeofday(&tv, NULL); +  +-	/* discard if too short */ +-	if (sz < (datalen + ICMP_MINLEN)) ++	/* discard if too short / long */ ++	if (sz < (datalen + ICMP_MINLEN) || sz > (MAXICMPLEN)) + 		return; +  + 	/* check IP header */ +@@ -274,6 +274,10 @@ + 		++nreceived; + 		tp = (struct timeval *) icmppkt->icmp_data; +  ++		/* If packet is too short, results will be truncated */ ++		if (sz < (ICMP_MINLEN + sizeof(tv.tv_sec) + sizeof(tv.tv_usec))) ++			return; ++ + 		if ((tv.tv_usec -= tp->tv_usec) < 0) { + 			--tv.tv_sec; + 			tv.tv_usec += 1000000;  | 
