]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ether.c
Ethernet: Rework the length checks
[tcpdump] / print-ether.c
index 2596cd6d7bad3dad47ba0f148ef9e6b93b269af3..954668c4a2b5bf759a4ae478ada2a2f6c7912a03 100644 (file)
@@ -150,14 +150,15 @@ ether_common_print(netdissect_options *ndo, const u_char *p, u_int length,
        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);
@@ -564,6 +565,9 @@ ethertype_print(netdissect_options *ndo,
                        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);