X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/6288c273b66fa124b58af66026151fff1d5931c2..383670e8f3f5b51d1017d8c1a678aa7eaf1f2b4d:/print-pktap.c diff --git a/print-pktap.c b/print-pktap.c index 7ae10f0f..05ce5f99 100644 --- a/print-pktap.c +++ b/print-pktap.c @@ -27,6 +27,7 @@ #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" @@ -107,10 +108,10 @@ pktap_if_print(netdissect_options *ndo, struct pcap_pkthdr nhdr; ndo->ndo_protocol = "pktap"; - if (caplen < sizeof(pktap_header_t)) { - nd_print_trunc(ndo); - ndo->ndo_ll_hdr_len += caplen; - return; + if (length < sizeof(pktap_header_t)) { + ND_PRINT(" (packet too short, %u < %zu)", + length, sizeof(pktap_header_t)); + goto invalid; } hdr = (const pktap_header_t *)p; dlt = GET_LE_U_4(hdr->pkt_dlt); @@ -123,15 +124,16 @@ pktap_if_print(netdissect_options *ndo, * is the length supplied so that the header can * be expanded in the future)? */ - nd_print_trunc(ndo); - ndo->ndo_ll_hdr_len += caplen; - return; + ND_PRINT(" (pkt_len too small, %u < %zu)", + hdrlen, sizeof(pktap_header_t)); + goto invalid; } - if (caplen < hdrlen) { - nd_print_trunc(ndo); - ndo->ndo_ll_hdr_len += caplen; - return; + if (hdrlen > length) { + ND_PRINT(" (pkt_len too big, %u > %u)", + hdrlen, length); + goto invalid; } + ND_TCHECK_LEN(p, hdrlen); if (ndo->ndo_eflag) pktap_header_print(ndo, p, length); @@ -167,5 +169,9 @@ pktap_if_print(netdissect_options *ndo, } ndo->ndo_ll_hdr_len += hdrlen; + return; + +invalid: + nd_print_invalid(ndo); } #endif /* DLT_PKTAP */