};
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])) {
return (cp);
}
-/* print a <domain-name> */
static const u_char *
blabel_print(netdissect_options *ndo,
const u_char *cp)
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;
{ T_MAILB, "MAILB" }, /* RFC 1035 */
{ T_MAILA, "MAILA" }, /* RFC 1035 */
{ T_ANY, "ANY" },
+ { T_URI, "URI" }, /* RFC 7553 */
{ 0, NULL }
};
}
ND_PRINT("? ");
- cp = ns_nprint(ndo, np, bp);
+ cp = fqdn_print(ndo, np, bp);
return(cp ? cp + 4 : NULL);
}
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);
case T_DNAME:
#endif
ND_PRINT(" ");
- if (ns_nprint(ndo, cp, bp) == NULL)
+ if (fqdn_print(ndo, cp, bp) == NULL)
return(NULL);
break;
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);
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;
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));
case T_A6:
{
- struct in6_addr a;
+ nd_ipv6 a;
int pbit, pbyte;
char ntop_buf[INET6_ADDRSTRLEN];
} 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)
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))
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 */