diff options
author | 2014-12-03 13:22:18 +0000 | |
---|---|---|
committer | 2014-12-03 13:22:18 +0000 | |
commit | 471f5c51b9de9a22ff705b1e8bf9f52d2f8138aa (patch) | |
tree | df9597da3fb85eba6493cc2794b6d2e0f99c5137 | |
parent | Fixup a crash found by jsg using the AFL fuzzer. IP and IPv6 printing (diff) | |
download | wireguard-openbsd-471f5c51b9de9a22ff705b1e8bf9f52d2f8138aa.tar.xz wireguard-openbsd-471f5c51b9de9a22ff705b1e8bf9f52d2f8138aa.zip |
Restore packetp and snapend pointers once we're done with an incorrectly
aligned IP/IPv6 packet so that tcpdump can print hexdump of the whole
packet including the Ethernet header (if requested) and not only the
IP/IPv6 part of it.
ok jsg
-rw-r--r-- | usr.sbin/tcpdump/print-ip.c | 19 | ||||
-rw-r--r-- | usr.sbin/tcpdump/print-ip6.c | 14 |
2 files changed, 22 insertions, 11 deletions
diff --git a/usr.sbin/tcpdump/print-ip.c b/usr.sbin/tcpdump/print-ip.c index c13550f7ae9..11c183ace1e 100644 --- a/usr.sbin/tcpdump/print-ip.c +++ b/usr.sbin/tcpdump/print-ip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-ip.c,v 1.40 2014/12/03 13:19:03 mikeb Exp $ */ +/* $OpenBSD: print-ip.c,v 1.41 2014/12/03 13:22:18 mikeb Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 @@ -356,6 +356,8 @@ ip_print(register const u_char *bp, register u_int length) register const struct ip *ip; register u_int hlen, len, off; register const u_char *cp; + const u_char *pktp = packetp; + const u_char *send = snapend; ip = (const struct ip *)bp; if ((u_char *)(ip + 1) > snapend) { @@ -394,7 +396,7 @@ ip_print(register const u_char *bp, register u_int length) TCHECK(*ip); if (ip->ip_v != IPVERSION) { (void)printf("bad-ip-version %u", ip->ip_v); - return; + goto out; } len = ntohs(ip->ip_len); @@ -407,7 +409,7 @@ ip_print(register const u_char *bp, register u_int length) hlen = ip->ip_hl * 4; if (hlen < sizeof(struct ip) || hlen > len) { (void)printf("bad-hlen %d", hlen); - return; + goto out; } len -= hlen; @@ -472,7 +474,7 @@ ip_print(register const u_char *bp, register u_int length) ip_print(cp, len); if (! vflag) { printf(" (encap)"); - return; + goto out; } break; @@ -489,7 +491,7 @@ ip_print(register const u_char *bp, register u_int length) ip6_print(cp, len); if (! vflag) { printf(" (encap)"); - return; + goto out; } break; #endif /*INET6*/ @@ -506,7 +508,7 @@ ip_print(register const u_char *bp, register u_int length) gre_print(cp, len); if (! vflag) { printf(" (gre encap)"); - return; + goto out; } break; @@ -535,7 +537,7 @@ ip_print(register const u_char *bp, register u_int length) mobile_print(cp, len); if (! vflag) { printf(" (mobile encap)"); - return; + goto out; } break; @@ -660,6 +662,9 @@ ip_print(register const u_char *bp, register u_int length) } printf(")"); } +out: + packetp = pktp; + snapend = send; return; trunc: diff --git a/usr.sbin/tcpdump/print-ip6.c b/usr.sbin/tcpdump/print-ip6.c index 1df561fa839..c41973d768e 100644 --- a/usr.sbin/tcpdump/print-ip6.c +++ b/usr.sbin/tcpdump/print-ip6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-ip6.c,v 1.18 2014/12/03 13:19:03 mikeb Exp $ */ +/* $OpenBSD: print-ip6.c,v 1.19 2014/12/03 13:22:18 mikeb Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994 @@ -56,6 +56,8 @@ ip6_print(register const u_char *bp, register u_int length) register int hlen; register int len; register const u_char *cp; + const u_char *pktp = packetp; + const u_char *send = snapend; int nh; u_int flow; @@ -95,11 +97,11 @@ ip6_print(register const u_char *bp, register u_int length) if (length < sizeof (struct ip6_hdr)) { (void)printf("truncated-ip6 %d", length); - return; + goto out; } if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { (void)printf("bad-ip6-version %u", ip6->ip6_vfc >> 4); - return; + goto out; } hlen = sizeof(struct ip6_hdr); @@ -206,7 +208,7 @@ ip6_print(register const u_char *bp, register u_int length) } end: - + flow = ntohl(ip6->ip6_flow); #if 0 /* rfc1883 */ @@ -232,6 +234,10 @@ ip6_print(register const u_char *bp, register u_int length) (void)printf(", hlim %d", (int)ip6->ip6_hlim); printf(")"); } + + out: + packetp = pktp; + snapend = send; } #endif /* INET6 */ |