X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b9ac23ce92ca22483d56ee3192c54aa8f782f9ac..f5c79aedbe9c52dad10a196d805718f55a2be17a:/print-domain.c diff --git a/print-domain.c b/print-domain.c index 22717977..98eb3a5e 100644 --- a/print-domain.c +++ b/print-domain.c @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.42 1999-11-21 09:36:50 fenner Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.55 2000-10-10 05:05:07 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -30,22 +30,8 @@ static const char rcsid[] = #include #include -#include - -#if __STDC__ -struct mbuf; -struct rtentry; -#endif -#include #include -#include -#include -#include -#include -#include -#include -#include #ifdef NOERROR #undef NOERROR /* Solaris sucks */ @@ -53,7 +39,7 @@ struct rtentry; #ifdef NOERROR #undef T_UNSPEC /* SINIX does too */ #endif -#include +#include "nameser.h" #include #include @@ -176,8 +162,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; @@ -189,13 +178,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, (u_char *)""); + 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; } @@ -407,15 +412,17 @@ ns_print(register const u_char *bp, u_int length) nscount = ntohs(np->nscount); arcount = ntohs(np->arcount); - if (np->qr) { + if (DNS_QR(np)) { /* this is a response */ - printf(" %d%s%s%s%s%s", + printf(" %d%s%s%s%s%s%s", ntohs(np->id), - ns_ops[np->opcode], - ns_resp[np->rcode], - np->aa? "*" : "", - np->ra? "" : "-", - np->tc? "|" : ""); + ns_ops[DNS_OPCODE(np)], + ns_resp[DNS_RCODE(np)], + DNS_AA(np)? "*" : "", + DNS_RA(np)? "" : "-", + DNS_TC(np)? "|" : "", + DNS_CD(np)? "%" : ""); + if (qdcount != 1) printf(" [%dq]", qdcount); /* Print QUESTION section on -vv */ @@ -435,16 +442,17 @@ ns_print(register const u_char *bp, u_int length) } else { /* this is a request */ - printf(" %d%s%s", + printf(" %d%s%s%s", ntohs(np->id), - ns_ops[np->opcode], - np->rd? "+" : ""); + ns_ops[DNS_OPCODE(np)], + DNS_RD(np)? "+" : "", + DNS_AD(np)? "$" : ""); /* any weirdness? */ - if (*(((u_short *)np)+1) & htons(0x6ff)) + if (*(((u_short *)np)+1) & htons(0x6cf)) printf(" [b2&3=0x%x]", ntohs(*(((u_short *)np)+1))); - if (np->opcode == IQUERY) { + if (DNS_OPCODE(np) == IQUERY) { if (qdcount) printf(" [%dq]", qdcount); if (ancount != 1)