X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/abc8c2d61c65757011d9d32abb01cd1e51232f3a..c518a9aab149da1a6b83c0cbeddaff5265d05dcb:/print-domain.c diff --git a/print-domain.c b/print-domain.c index ad08073f..c3c6fd8f 100644 --- a/print-domain.c +++ b/print-domain.c @@ -74,12 +74,15 @@ ns_nskip(netdissect_options *ndo, i = GET_U_1(cp); cp++; while (i) { - if ((i & INDIR_MASK) == INDIR_MASK) + switch (i & TYPE_MASK) { + + case TYPE_INDIR: return (cp + 1); - if ((i & INDIR_MASK) == EDNS0_MASK) { + + case TYPE_EDNS0: { int bitlen, bytelen; - if ((i & ~INDIR_MASK) != EDNS0_ELT_BITLABEL) + if ((i & ~TYPE_MASK) != EDNS0_ELT_BITLABEL) return(NULL); /* unknown ELT */ if (!ND_TTEST_1(cp)) return (NULL); @@ -88,8 +91,16 @@ ns_nskip(netdissect_options *ndo, cp++; bytelen = (bitlen + 7) / 8; cp += bytelen; - } else + } + break; + + case TYPE_RESERVED: + return (NULL); + + case TYPE_LABEL: cp += i; + break; + } if (!ND_TTEST_1(cp)) return (NULL); i = GET_U_1(cp); @@ -140,9 +151,11 @@ labellen(netdissect_options *ndo, if (!ND_TTEST_1(cp)) return(-1); i = GET_U_1(cp); - if ((i & INDIR_MASK) == EDNS0_MASK) { + switch (i & TYPE_MASK) { + + case TYPE_EDNS0: { u_int bitlen, elt; - if ((elt = (i & ~INDIR_MASK)) != EDNS0_ELT_BITLABEL) { + if ((elt = (i & ~TYPE_MASK)) != EDNS0_ELT_BITLABEL) { ND_PRINT("", elt); return(-1); } @@ -151,8 +164,20 @@ labellen(netdissect_options *ndo, if ((bitlen = GET_U_1(cp + 1)) == 0) bitlen = 256; return(((bitlen + 7) / 8) + 1); - } else + } + + case TYPE_INDIR: + case TYPE_LABEL: return(i); + + default: + /* + * TYPE_RESERVED, but we use default to suppress compiler + * warnings about falling out of the switch statement. + */ + ND_PRINT(""); + return(-1); + } } /* print a */ @@ -165,6 +190,7 @@ fqdn_print(netdissect_options *ndo, int compress = 0; u_int elt; u_int offset, max_offset; + u_int name_chars = 0; if ((l = labellen(ndo, cp)) == (u_int)-1) return(NULL); @@ -173,14 +199,16 @@ fqdn_print(netdissect_options *ndo, max_offset = (u_int)(cp - bp); i = GET_U_1(cp); cp++; - if ((i & INDIR_MASK) != INDIR_MASK) { + if ((i & TYPE_MASK) != TYPE_INDIR) { compress = 0; rp = cp + l; } - if (i != 0) + if (i != 0) { while (i && cp < ndo->ndo_snapend) { - if ((i & INDIR_MASK) == INDIR_MASK) { + switch (i & TYPE_MASK) { + + case TYPE_INDIR: if (!compress) { rp = cp + 1; compress = 1; @@ -204,16 +232,16 @@ fqdn_print(netdissect_options *ndo, } max_offset = offset; cp = bp + offset; - if ((l = labellen(ndo, cp)) == (u_int)-1) - return(NULL); if (!ND_TTEST_1(cp)) return(NULL); i = GET_U_1(cp); + if ((l = labellen(ndo, cp)) == (u_int)-1) + return(NULL); cp++; continue; - } - if ((i & INDIR_MASK) == EDNS0_MASK) { - elt = (i & ~INDIR_MASK); + + case TYPE_EDNS0: + elt = (i & ~TYPE_MASK); switch(elt) { case EDNS0_ELT_BITLABEL: if (blabel_print(ndo, cp) == NULL) @@ -224,23 +252,41 @@ fqdn_print(netdissect_options *ndo, ND_PRINT("", elt); return(NULL); } - } else { - if (nd_printn(ndo, cp, l, ndo->ndo_snapend)) - return(NULL); + break; + + case TYPE_RESERVED: + ND_PRINT(""); + return(NULL); + + case TYPE_LABEL: + if (name_chars + l <= MAXCDNAME) { + if (nd_printn(ndo, cp, l, ndo->ndo_snapend)) + return(NULL); + } else if (name_chars < MAXCDNAME) { + if (nd_printn(ndo, cp, + MAXCDNAME - name_chars, ndo->ndo_snapend)) + return(NULL); + } + name_chars += l; + break; } cp += l; - ND_PRINT("."); - if ((l = labellen(ndo, cp)) == (u_int)-1) - return(NULL); + if (name_chars <= MAXCDNAME) + ND_PRINT("."); + name_chars++; if (!ND_TTEST_1(cp)) return(NULL); i = GET_U_1(cp); + if ((l = labellen(ndo, cp)) == (u_int)-1) + return(NULL); cp++; if (!compress) rp += l + 1; } - else + if (name_chars > MAXCDNAME) + ND_PRINT(""); + } else ND_PRINT("."); return (rp); } @@ -667,9 +713,7 @@ ns_rprint(netdissect_options *ndo, case T_NS: case T_CNAME: case T_PTR: -#ifdef T_DNAME case T_DNAME: -#endif ND_PRINT(" "); if (fqdn_print(ndo, cp, bp) == NULL) return(NULL); @@ -752,10 +796,8 @@ ns_rprint(netdissect_options *ndo, ND_PRINT(" %u(bad plen)", pbit); break; } else if (pbit < 128) { - if (!ND_TTEST_LEN(cp + 1, sizeof(a) - pbyte)) - return(NULL); memset(a, 0, sizeof(a)); - memcpy(a + pbyte, cp + 1, sizeof(a) - pbyte); + GET_CPY_BYTES(a + pbyte, cp + 1, sizeof(a) - pbyte); ND_PRINT(" %u %s", pbit, addrtostr6(&a, ntop_buf, sizeof(ntop_buf))); }