]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-domain.c
Clean up comments.
[tcpdump] / print-domain.c
index db8b8f4cc0bdd9fb98a176a1473bea8cb6fd0b55..e83a4afe9fbe12b97ff1b32597b8736a51504d07 100644 (file)
@@ -52,7 +52,7 @@ static const char *ns_resp[] = {
 };
 
 static const char *
-ns_rcode(int rcode) {
+ns_rcode(u_int rcode) {
        static char buf[sizeof(" Resp4095")];
 
        if (rcode < sizeof(ns_resp)/sizeof(ns_resp[0])) {
@@ -98,7 +98,6 @@ ns_nskip(netdissect_options *ndo,
        return (cp);
 }
 
-/* print a <domain-name> */
 static const u_char *
 blabel_print(netdissect_options *ndo,
              const u_char *cp)
@@ -162,8 +161,9 @@ labellen(netdissect_options *ndo,
                return(i);
 }
 
+/* print a <domain-name> */
 const u_char *
-ns_nprint(netdissect_options *ndo,
+fqdn_print(netdissect_options *ndo,
           const u_char *cp, const u_char *bp)
 {
        u_int i, l;
@@ -332,6 +332,7 @@ const struct tok ns_type2str[] = {
        { T_MAILB,      "MAILB" },              /* RFC 1035 */
        { T_MAILA,      "MAILA" },              /* RFC 1035 */
        { T_ANY,        "ANY" },
+       { T_URI,        "URI" },                /* RFC 7553 */
        { 0,            NULL }
 };
 
@@ -376,7 +377,7 @@ ns_qprint(netdissect_options *ndo,
        }
 
        ND_PRINT("? ");
-       cp = ns_nprint(ndo, np, bp);
+       cp = fqdn_print(ndo, np, bp);
        return(cp ? cp + 4 : NULL);
 }
 
@@ -391,7 +392,7 @@ ns_rprint(netdissect_options *ndo,
 
        if (ndo->ndo_vflag) {
                ND_PRINT(" ");
-               if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+               if ((cp = fqdn_print(ndo, cp, bp)) == NULL)
                        return NULL;
        } else
                cp = ns_nskip(ndo, cp);
@@ -456,7 +457,7 @@ ns_rprint(netdissect_options *ndo,
        case T_DNAME:
 #endif
                ND_PRINT(" ");
-               if (ns_nprint(ndo, cp, bp) == NULL)
+               if (fqdn_print(ndo, cp, bp) == NULL)
                        return(NULL);
                break;
 
@@ -464,10 +465,10 @@ ns_rprint(netdissect_options *ndo,
                if (!ndo->ndo_vflag)
                        break;
                ND_PRINT(" ");
-               if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+               if ((cp = fqdn_print(ndo, cp, bp)) == NULL)
                        return(NULL);
                ND_PRINT(" ");
-               if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+               if ((cp = fqdn_print(ndo, cp, bp)) == NULL)
                        return(NULL);
                if (!ND_TTEST_LEN(cp, 5 * 4))
                        return(NULL);
@@ -486,7 +487,7 @@ ns_rprint(netdissect_options *ndo,
                ND_PRINT(" ");
                if (!ND_TTEST_2(cp))
                        return(NULL);
-               if (ns_nprint(ndo, cp + 2, bp) == NULL)
+               if (fqdn_print(ndo, cp + 2, bp) == NULL)
                        return(NULL);
                ND_PRINT(" %u", GET_BE_U_2(cp));
                break;
@@ -505,7 +506,7 @@ ns_rprint(netdissect_options *ndo,
                ND_PRINT(" ");
                if (!ND_TTEST_6(cp))
                        return(NULL);
-               if (ns_nprint(ndo, cp + 6, bp) == NULL)
+               if (fqdn_print(ndo, cp + 6, bp) == NULL)
                        return(NULL);
                ND_PRINT(":%u %u %u", GET_BE_U_2(cp + 4),
                          GET_BE_U_2(cp), GET_BE_U_2(cp + 2));
@@ -525,7 +526,7 @@ ns_rprint(netdissect_options *ndo,
 
        case T_A6:
            {
-               struct in6_addr a;
+               nd_ipv6 a;
                int pbit, pbyte;
                char ntop_buf[INET6_ADDRSTRLEN];
 
@@ -539,19 +540,27 @@ ns_rprint(netdissect_options *ndo,
                } else if (pbit < 128) {
                        if (!ND_TTEST_LEN(cp + 1, sizeof(a) - pbyte))
                                return(NULL);
-                       memset(&a, 0, sizeof(a));
-                       memcpy(&a.s6_addr[pbyte], cp + 1, sizeof(a) - pbyte);
+                       memset(a, 0, sizeof(a));
+                       memcpy(a + pbyte, cp + 1, sizeof(a) - pbyte);
                        ND_PRINT(" %u %s", pbit,
                            addrtostr6(&a, ntop_buf, sizeof(ntop_buf)));
                }
                if (pbit > 0) {
                        ND_PRINT(" ");
-                       if (ns_nprint(ndo, cp + 1 + sizeof(a) - pbyte, bp) == NULL)
+                       if (fqdn_print(ndo, cp + 1 + sizeof(a) - pbyte, bp) == NULL)
                                return(NULL);
                }
                break;
            }
 
+       case T_URI:
+               if (!ND_TTEST_LEN(cp, len))
+                       return(NULL);
+               ND_PRINT(" %u %u ", GET_BE_U_2(cp), GET_BE_U_2(cp + 2));
+               if (nd_printn(ndo, cp + 4, len - 4, ndo->ndo_snapend))
+                       return(NULL);
+               break;
+
        case T_OPT:
                ND_PRINT(" UDPsize=%u", class);
                if (opt_flags & 0x8000)
@@ -572,7 +581,7 @@ ns_rprint(netdissect_options *ndo,
                if (!ndo->ndo_vflag)
                        break;
                ND_PRINT(" ");
-               if ((cp = ns_nprint(ndo, cp, bp)) == NULL)
+               if ((cp = fqdn_print(ndo, cp, bp)) == NULL)
                        return(NULL);
                cp += 6;
                if (!ND_TTEST_2(cp))
@@ -613,6 +622,14 @@ domain_print(netdissect_options *ndo,
 
        ndo->ndo_protocol = "domain";
        np = (const dns_header_t *)bp;
+
+       if(length < sizeof(*np)) {
+               nd_print_protocol(ndo);
+               ND_PRINT(" [length %u < %zu]", length, sizeof(*np));
+               nd_print_invalid(ndo);
+               return;
+       }
+
        ND_TCHECK_SIZE(np);
        flags = GET_BE_U_2(np->flags);
        /* get the byte-order right */