]> The Tcpdump Group git mirrors - tcpdump/commitdiff
VXLAN-GPE: Modernize packet parsing style.
authorDenis Ovsienko <[email protected]>
Sat, 17 Oct 2020 13:13:58 +0000 (14:13 +0100)
committerDenis Ovsienko <[email protected]>
Sat, 17 Oct 2020 16:52:29 +0000 (17:52 +0100)
Enable ND_LONGJMP_FROM_TCHECK. Add and use a standard invalid packet
label. Advance one field at a time and decrement the length.

print-vxlan-gpe.c

index 309f65c76d9563213827b9606d16f887a3af20a5..13cba422937778626aaf9c212c908b4748a80679 100644 (file)
@@ -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);
 }