diff options
author | Denis Ovsienko <denis@ovsienko.info> | 2020-10-17 14:13:58 +0100 |
---|---|---|
committer | Denis Ovsienko <denis@ovsienko.info> | 2020-10-17 17:52:29 +0100 |
commit | e37e1b0c82e08f2382286e5acd200645e4627165 (patch) | |
tree | 6db23ea1983de8e6680adac80e2932693d847489 /print-vxlan-gpe.c | |
parent | 13add7753420d0e16552d951dd405eff98dc01b9 (diff) | |
download | tcpdump-e37e1b0c82e08f2382286e5acd200645e4627165.tar.gz |
VXLAN-GPE: Modernize packet parsing style.
Enable ND_LONGJMP_FROM_TCHECK. Add and use a standard invalid packet
label. Advance one field at a time and decrement the length.
Diffstat (limited to 'print-vxlan-gpe.c')
-rw-r--r-- | print-vxlan-gpe.c | 45 |
1 files changed, 29 insertions, 16 deletions
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); } |