int llc_hdrlen;
struct lladdr_info src, dst;
+ if (length < caplen) {
+ ND_PRINT("[length %u < caplen %u]", length, caplen);
+ nd_print_invalid(ndo);
+ return length;
+ }
if (caplen < ETHER_HDRLEN + switch_tag_len) {
nd_print_trunc(ndo);
return caplen;
}
- if (length < ETHER_HDRLEN + switch_tag_len) {
- nd_print_trunc(ndo);
- return length;
- }
if (print_encap_header != NULL)
(*print_encap_header)(ndo, encap_header_arg);
}
int ret = macsec_print(ndo, &p, &length, &caplen, &hdrlen,
- &src, &dst);
+ &src, &dst);
if (ret == 0) {
/* Payload is encrypted; print it as raw data. */
*/
length_type = GET_BE_U_2(p);
+ ND_LCHECK_U(caplen, 2);
length -= 2;
caplen -= 2;
p += 2;
ND_DEFAULTPRINT(p, caplen);
}
}
+invalid:
return hdrlen;
}
nd_print_trunc(ndo);
return (1);
}
+ /* At least one byte is required */
+ /* FIXME: Reference for this byte? */
+ ND_TCHECK_1(p);
isoclns_print(ndo, p + 1, length - 1);
return(1);