diff options
author | Florian Fainelli <florian@openwrt.org> | 2007-02-28 19:45:36 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2007-02-28 19:45:36 +0000 |
commit | 9c6fe1626037f8ca709c14800ca3fef0625a3d48 (patch) | |
tree | 6975d9d15d97777f053f17a525484cf0ebd42fde /package/busybox | |
parent | 2a7df081194176aa9f57e30899e9e31970c0712a (diff) | |
download | upstream-9c6fe1626037f8ca709c14800ca3fef0625a3d48.tar.gz upstream-9c6fe1626037f8ca709c14800ca3fef0625a3d48.tar.bz2 upstream-9c6fe1626037f8ca709c14800ca3fef0625a3d48.zip |
Fix truncated pings results when packets are too small. Also check for packet maximum size, so that busybox's ping could not be responsible for flooding hosts.
SVN-Revision: 6443
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 0000000000..30e86701a3 --- /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; |