X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c9d84d15c5c4dc8eca7594101fe5026080ed641e..f5c79aedbe9c52dad10a196d805718f55a2be17a:/print-domain.c?ds=sidebyside diff --git a/print-domain.c b/print-domain.c index e251df88..98eb3a5e 100644 --- a/print-domain.c +++ b/print-domain.c @@ -21,27 +21,17 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.41 1999-10-30 05:11:12 itojun 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 +#include "config.h" #endif #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 */ @@ -49,7 +39,7 @@ struct rtentry; #ifdef NOERROR #undef T_UNSPEC /* SINIX does too */ #endif -#include +#include "nameser.h" #include #include @@ -172,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; @@ -185,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; } @@ -403,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 */ @@ -431,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)