summaryrefslogtreecommitdiffstats
path: root/usr.sbin/tcpdump/print-domain.c
diff options
context:
space:
mode:
authorjakob <jakob@openbsd.org>2000-04-26 21:35:36 +0000
committerjakob <jakob@openbsd.org>2000-04-26 21:35:36 +0000
commitedd7aa8f67df825a965c4ef6f0e226f29443ab4c (patch)
treea2ae67108629743ed0713cf19ec6c5c80a139c8c /usr.sbin/tcpdump/print-domain.c
parentremove debug (diff)
downloadwireguard-openbsd-edd7aa8f67df825a965c4ef6f0e226f29443ab4c.tar.xz
wireguard-openbsd-edd7aa8f67df825a965c4ef6f0e226f29443ab4c.zip
INET6
DHCP/BOOTP tcp & udp checksum detection numerous bugfixes
Diffstat (limited to 'usr.sbin/tcpdump/print-domain.c')
-rw-r--r--usr.sbin/tcpdump/print-domain.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/usr.sbin/tcpdump/print-domain.c b/usr.sbin/tcpdump/print-domain.c
index 569004fc7e3..b6fdd9e9e08 100644
--- a/usr.sbin/tcpdump/print-domain.c
+++ b/usr.sbin/tcpdump/print-domain.c
@@ -21,7 +21,7 @@
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /home/cvs/src/usr.sbin/tcpdump/print-domain.c,v 1.9 2000/01/16 12:43:58 jakob Exp $ (LBL)";
+ "@(#) $Header: /home/cvs/src/usr.sbin/tcpdump/print-domain.c,v 1.10 2000/04/26 21:35:40 jakob Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -42,7 +42,6 @@ struct rtentry;
#include <netinet/udp.h>
#include <netinet/udp_var.h>
#include <netinet/tcp.h>
-#include <netinet/tcpip.h>
#ifdef NOERROR
#undef NOERROR /* Solaris sucks */
@@ -53,6 +52,7 @@ struct rtentry;
#include <arpa/nameser.h>
#include <stdio.h>
+#include <string.h>
#include "interface.h"
#include "addrtoname.h"
@@ -172,8 +172,11 @@ ns_nprint(register const u_char *cp, register const u_char *bp)
register u_int i;
register const u_char *rp;
register int compress;
+ int chars_processed;
+ int data_size = snapend - bp;
i = *cp++;
+ chars_processed = 1;
rp = cp + i;
if ((i & INDIR_MASK) == INDIR_MASK) {
rp = cp + 1;
@@ -185,13 +188,29 @@ ns_nprint(register const u_char *cp, register const u_char *bp)
if ((i & INDIR_MASK) == INDIR_MASK) {
cp = bp + (((i << 8) | *cp) & 0x3fff);
i = *cp++;
+ chars_processed++;
+
+ /*
+ * If we've looked at every character in
+ * the message, this pointer will make
+ * us look at some character again,
+ * which means we're looping.
+ */
+ if (chars_processed >= data_size) {
+ fn_printn(cp, 6, "<LOOP>");
+ if (!compress)
+ rp += i + 1;
+ return (rp);
+ }
continue;
}
if (fn_printn(cp, i, snapend))
break;
cp += i;
+ chars_processed += i;
putchar('.');
i = *cp++;
+ chars_processed++;
if (!compress)
rp += i + 1;
}