Avoid a divide-by-zero when bad checksum counters overflow.
A mixture of IP or UDP packets with valid and invalid checksum could cause {ip,udp}_packets_bad_checksum to wrap around to 0, resulting in a division by zero. This is packet.c rev. 1.27 from OpenBSD. admbugs: 552 Obtained from: OpenBSD MFC after: 3 days
This commit is contained in:
parent
b66ed8ee28
commit
a3ae40c7a4
@ -183,7 +183,7 @@ decode_udp_ip_header(unsigned char *buf, int bufix, struct sockaddr_in *from,
|
|||||||
ip_packets_seen++;
|
ip_packets_seen++;
|
||||||
if (wrapsum(checksum(buf + bufix, ip_len, 0)) != 0) {
|
if (wrapsum(checksum(buf + bufix, ip_len, 0)) != 0) {
|
||||||
ip_packets_bad_checksum++;
|
ip_packets_bad_checksum++;
|
||||||
if (ip_packets_seen > 4 &&
|
if (ip_packets_seen > 4 && ip_packets_bad_checksum != 0 &&
|
||||||
(ip_packets_seen / ip_packets_bad_checksum) < 2) {
|
(ip_packets_seen / ip_packets_bad_checksum) < 2) {
|
||||||
note("%d bad IP checksums seen in %d packets",
|
note("%d bad IP checksums seen in %d packets",
|
||||||
ip_packets_bad_checksum, ip_packets_seen);
|
ip_packets_bad_checksum, ip_packets_seen);
|
||||||
@ -235,7 +235,7 @@ decode_udp_ip_header(unsigned char *buf, int bufix, struct sockaddr_in *from,
|
|||||||
udp_packets_seen++;
|
udp_packets_seen++;
|
||||||
if (usum && usum != sum) {
|
if (usum && usum != sum) {
|
||||||
udp_packets_bad_checksum++;
|
udp_packets_bad_checksum++;
|
||||||
if (udp_packets_seen > 4 &&
|
if (udp_packets_seen > 4 && udp_packets_bad_checksum != 0 &&
|
||||||
(udp_packets_seen / udp_packets_bad_checksum) < 2) {
|
(udp_packets_seen / udp_packets_bad_checksum) < 2) {
|
||||||
note("%d bad udp checksums in %d packets",
|
note("%d bad udp checksums in %d packets",
|
||||||
udp_packets_bad_checksum, udp_packets_seen);
|
udp_packets_bad_checksum, udp_packets_seen);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user