mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-24 02:23:27 +08:00
When adding the last byte of an odd number of bytes to a TCP or UDP
checksum, fetch it by casting the pointer to "const u_int8_t *" rather than "const char *" - casting it to "const char *" causes it to be sign-extended, perhaps causing 16 1 bits to be added in at the top and, at least on big-endian platforms (where "htons()" does nothing, meaning it won't trim off the extra 16 bits) with signed "char"s (e.g., SPARC), causing the checksum to be computed incorrectly and causing it to incorrectly be reported as bad.
This commit is contained in:
parent
e98a140573
commit
a329c9ae7c
@ -21,7 +21,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.80 2000-11-17 19:08:16 itojun Exp $ (LBL)";
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.81 2000-12-23 20:55:22 guy Exp $ (LBL)";
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
@ -169,7 +169,7 @@ static int tcp_cksum(register const struct ip *ip,
|
||||
sum += *sp++;
|
||||
|
||||
if (tlen & 1) {
|
||||
sum += htons( (*(const char *)sp) << 8);
|
||||
sum += htons( (*(const u_int8_t *)sp) << 8);
|
||||
}
|
||||
|
||||
while (sum > 0xffff)
|
||||
@ -217,7 +217,7 @@ static int tcp6_cksum(const struct ip6_hdr *ip6, const struct tcphdr *tp,
|
||||
sum += *sp++;
|
||||
|
||||
if (tlen & 1)
|
||||
sum += htons((*(const char *)sp) << 8);
|
||||
sum += htons((*(const u_int8_t *)sp) << 8);
|
||||
|
||||
while (sum > 0xffff)
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.89 2000-11-17 19:08:16 itojun Exp $ (LBL)";
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.90 2000-12-23 20:55:22 guy Exp $ (LBL)";
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
@ -325,7 +325,7 @@ static int udp_cksum(register const struct ip *ip,
|
||||
sum += *sp++;
|
||||
|
||||
if (tlen & 1) {
|
||||
sum += htons( (*(const char *)sp) << 8);
|
||||
sum += htons( (*(const u_int8_t *)sp) << 8);
|
||||
}
|
||||
|
||||
while (sum > 0xffff)
|
||||
@ -373,7 +373,7 @@ static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
|
||||
sum += *sp++;
|
||||
|
||||
if (tlen & 1)
|
||||
sum += htons((*(const char *)sp) << 8);
|
||||
sum += htons((*(const u_int8_t *)sp) << 8);
|
||||
|
||||
while (sum > 0xffff)
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
|
Loading…
Reference in New Issue
Block a user