summaryrefslogtreecommitdiffstats
path: root/usr.sbin/tcpdump/print-ip.c
diff options
context:
space:
mode:
authormikeb <mikeb@openbsd.org>2014-12-03 13:22:18 +0000
committermikeb <mikeb@openbsd.org>2014-12-03 13:22:18 +0000
commit471f5c51b9de9a22ff705b1e8bf9f52d2f8138aa (patch)
treedf9597da3fb85eba6493cc2794b6d2e0f99c5137 /usr.sbin/tcpdump/print-ip.c
parentFixup a crash found by jsg using the AFL fuzzer. IP and IPv6 printing (diff)
downloadwireguard-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
Diffstat (limited to 'usr.sbin/tcpdump/print-ip.c')
-rw-r--r--usr.sbin/tcpdump/print-ip.c19
1 files changed, 12 insertions, 7 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: