]> The Tcpdump Group git mirrors - tcpdump/commitdiff
MPLS: Modernize packet parsing style.
authorDenis Ovsienko <[email protected]>
Thu, 10 Dec 2020 01:02:52 +0000 (01:02 +0000)
committerDenis Ovsienko <[email protected]>
Tue, 15 Dec 2020 01:06:24 +0000 (01:06 +0000)
Enable ND_LONGJMP_FROM_TCHECK. Remove both ND_TCHECK*() instances
because they are redundant. Report invalid packets as invalid, not
truncated. Test whether the invalid packet is entirely in the buffer.
Replace a long switch block with a ternary assignment.

print-mpls.c

index 4351507eea03b5683fd812c2f6b23982021d9e16..b8820aa9c6ffae631a3db4c55cf49632a14ba044 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "netdissect-stdinc.h"
 
 
 #include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 #include "mpls.h"
 #include "netdissect.h"
 #include "extract.h"
 #include "mpls.h"
@@ -62,15 +63,15 @@ mpls_print(netdissect_options *ndo, const u_char *bp, u_int length)
        const u_char *p;
        uint32_t label_entry;
        uint16_t label_stack_depth = 0;
        const u_char *p;
        uint32_t label_entry;
        uint16_t label_stack_depth = 0;
+       uint8_t first;
        enum mpls_packet_type pt = PT_UNKNOWN;
 
        ndo->ndo_protocol = "mpls";
        p = bp;
        nd_print_protocol_caps(ndo);
        do {
        enum mpls_packet_type pt = PT_UNKNOWN;
 
        ndo->ndo_protocol = "mpls";
        p = bp;
        nd_print_protocol_caps(ndo);
        do {
-               ND_TCHECK_LEN(p, sizeof(label_entry));
                if (length < sizeof(label_entry))
                if (length < sizeof(label_entry))
-                       goto trunc;
+                       goto invalid;
                label_entry = GET_BE_U_4(p);
                ND_PRINT("%s(label %u",
                       (label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
                label_entry = GET_BE_U_4(p);
                ND_PRINT("%s(label %u",
                       (label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
@@ -128,56 +129,17 @@ mpls_print(netdissect_options *ndo, const u_char *bp, u_int length)
                 * Cisco sends control-plane traffic MPLS-encapsulated in
                 * this fashion.
                 */
                 * Cisco sends control-plane traffic MPLS-encapsulated in
                 * this fashion.
                 */
-               ND_TCHECK_1(p);
                if (length < 1) {
                        /* nothing to print */
                        return;
                }
                if (length < 1) {
                        /* nothing to print */
                        return;
                }
-               switch(GET_U_1(p)) {
-
-               case 0x45:
-               case 0x46:
-               case 0x47:
-               case 0x48:
-               case 0x49:
-               case 0x4a:
-               case 0x4b:
-               case 0x4c:
-               case 0x4d:
-               case 0x4e:
-               case 0x4f:
-                       pt = PT_IPV4;
-                       break;
-
-               case 0x60:
-               case 0x61:
-               case 0x62:
-               case 0x63:
-               case 0x64:
-               case 0x65:
-               case 0x66:
-               case 0x67:
-               case 0x68:
-               case 0x69:
-               case 0x6a:
-               case 0x6b:
-               case 0x6c:
-               case 0x6d:
-               case 0x6e:
-               case 0x6f:
-                       pt = PT_IPV6;
-                       break;
-
-               case 0x81:
-               case 0x82:
-               case 0x83:
-                       pt = PT_OSI;
-                       break;
-
-               default:
+               first = GET_U_1(p);
+               pt =
+                       (first >= 0x45 && first <= 0x4f) ? PT_IPV4 :
+                       (first >= 0x60 && first <= 0x6f) ? PT_IPV6 :
+                       (first >= 0x81 && first <= 0x83) ? PT_OSI :
                        /* ok bail out - we did not figure out what it is*/
                        /* ok bail out - we did not figure out what it is*/
-                       break;
-               }
+                       PT_UNKNOWN;
        }
 
        /*
        }
 
        /*
@@ -206,6 +168,7 @@ mpls_print(netdissect_options *ndo, const u_char *bp, u_int length)
        }
        return;
 
        }
        return;
 
-trunc:
-       nd_print_trunc(ndo);
+invalid:
+       nd_print_invalid(ndo);
+       ND_TCHECK_LEN(p, length);
 }
 }