X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/13add7753420d0e16552d951dd405eff98dc01b9..c39d40a767a1ae36171e5bcbf6f157ff3e80fb6c:/print-vxlan-gpe.c diff --git a/print-vxlan-gpe.c b/print-vxlan-gpe.c index 309f65c7..13cba422 100644 --- a/print-vxlan-gpe.c +++ b/print-vxlan-gpe.c @@ -31,6 +31,7 @@ #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" @@ -65,47 +66,59 @@ vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len) uint32_t vni; ndo->ndo_protocol = "vxlan_gpe"; - if (len < VXLAN_GPE_HDR_LEN) - goto trunc; - - ND_TCHECK_LEN(bp, VXLAN_GPE_HDR_LEN); + ND_PRINT("VXLAN-GPE, "); + if (len < VXLAN_GPE_HDR_LEN) { + ND_PRINT(" (len %u < %u)", len, VXLAN_GPE_HDR_LEN); + goto invalid; + } flags = GET_U_1(bp); - bp += 3; + bp += 1; + len -= 1; + ND_PRINT("flags [%s], ", + bittok2str_nosep(vxlan_gpe_flags, "none", flags)); + + /* Reserved */ + bp += 2; + len -= 2; next_protocol = GET_U_1(bp); bp += 1; + len -= 1; vni = GET_BE_U_3(bp); - bp += 4; + bp += 3; + len -= 3; + + /* Reserved */ + ND_TCHECK_1(bp); + bp += 1; + len -= 1; - ND_PRINT("VXLAN-GPE, "); - ND_PRINT("flags [%s], ", - bittok2str_nosep(vxlan_gpe_flags, "none", flags)); ND_PRINT("vni %u", vni); ND_PRINT(ndo->ndo_vflag ? "\n " : ": "); switch (next_protocol) { case 0x1: - ip_print(ndo, bp, len - VXLAN_GPE_HDR_LEN); + ip_print(ndo, bp, len); break; case 0x2: - ip6_print(ndo, bp, len - VXLAN_GPE_HDR_LEN); + ip6_print(ndo, bp, len); break; case 0x3: - ether_print(ndo, bp, len - VXLAN_GPE_HDR_LEN, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); + ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); break; case 0x4: - nsh_print(ndo, bp, len - VXLAN_GPE_HDR_LEN); + nsh_print(ndo, bp, len); break; default: ND_PRINT("ERROR: unknown-next-protocol"); - return; + goto invalid; } return; -trunc: - nd_print_trunc(ndo); +invalid: + nd_print_invalid(ndo); }