X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b751376719cfe1924aa07ab8fd364ec1a55c04b3..a63600a1fc28dbc7ae7ce9f996829c49a25fb33c:/print-chdlc.c diff --git a/print-chdlc.c b/print-chdlc.c index 5437c657..7450f357 100644 --- a/print-chdlc.c +++ b/print-chdlc.c @@ -27,6 +27,7 @@ #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "addrtoname.h" #include "ethertype.h" @@ -44,23 +45,22 @@ static const struct tok chdlc_cast_values[] = { /* Standard CHDLC printer */ -u_int +void chdlc_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p) { - ndo->ndo_protocol = "chdlc_if"; - return chdlc_print(ndo, p, h->len); + ndo->ndo_protocol = "chdlc"; + ND_TCHECK_LEN(p, CHDLC_HDRLEN); + ndo->ndo_ll_hdr_len += CHDLC_HDRLEN; + chdlc_print(ndo, p, h->len); } -u_int +void chdlc_print(netdissect_options *ndo, const u_char *p, u_int length) { u_int proto; - const u_char *bp = p; ndo->ndo_protocol = "chdlc"; - if (length < CHDLC_HDRLEN) - goto trunc; - ND_TCHECK_LEN(p, CHDLC_HDRLEN); + ND_ICHECK_U(length, <, CHDLC_HDRLEN); proto = GET_BE_U_2(p + 2); if (ndo->ndo_eflag) { ND_PRINT("%s, ethertype %s (0x%04x), length %u: ", @@ -83,20 +83,13 @@ chdlc_print(netdissect_options *ndo, const u_char *p, u_int length) case CHDLC_TYPE_SLARP: chdlc_slarp_print(ndo, p, length); break; -#if 0 - case CHDLC_TYPE_CDP: - chdlc_cdp_print(p, length); - break; -#endif case ETHERTYPE_MPLS: case ETHERTYPE_MPLS_MULTI: mpls_print(ndo, p, length); break; case ETHERTYPE_ISO: /* is the fudge byte set ? lets verify by spotting ISO headers */ - if (length < 2) - goto trunc; - ND_TCHECK_2(p); + ND_ICHECK_U(length, <, 2); if (GET_U_1(p + 1) == NLPID_CLNP || GET_U_1(p + 1) == NLPID_ESIS || GET_U_1(p + 1) == NLPID_ISIS) @@ -110,11 +103,10 @@ chdlc_print(netdissect_options *ndo, const u_char *p, u_int length) break; } - return (CHDLC_HDRLEN); + return; -trunc: - nd_print_trunc(ndo); - return (ND_BYTES_AVAILABLE_AFTER(bp)); +invalid: + nd_print_invalid(ndo); } /* @@ -148,9 +140,9 @@ chdlc_slarp_print(netdissect_options *ndo, const u_char *cp, u_int length) u_int sec,min,hrs,days; ndo->ndo_protocol = "chdlc_slarp"; - ND_PRINT("SLARP (length: %u), ",length); - if (length < SLARP_MIN_LEN) - goto trunc; + ND_PRINT("SLARP"); + ND_ICHECK_U(length, <, SLARP_MIN_LEN); + ND_PRINT(" (length: %u), ",length); slarp = (const struct cisco_slarp *)cp; ND_TCHECK_LEN(slarp, SLARP_MIN_LEN); @@ -180,7 +172,6 @@ chdlc_slarp_print(netdissect_options *ndo, const u_char *cp, u_int length) if (length >= SLARP_MAX_LEN) { /* uptime-stamp is optional */ cp += SLARP_MIN_LEN; - ND_TCHECK_4(cp); sec = GET_BE_U_4(cp) / 1000; min = sec / 60; sec -= min * 60; hrs = min / 60; min -= hrs * 60; @@ -201,6 +192,6 @@ chdlc_slarp_print(netdissect_options *ndo, const u_char *cp, u_int length) print_unknown_data(ndo,cp+4,"\n\t",length-4); return; -trunc: - nd_print_trunc(ndo); +invalid: + nd_print_invalid(ndo); }