]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-dtp.c
CI: Add warning exemptions for Sun C (suncc-5.14) on Solaris 10
[tcpdump] / print-dtp.c
index 1d8c66a0004634e06206350eaad49a462ba222c9..9ff4c1c9a9ff5384836d3fb03b03e1bb777dccb4 100644 (file)
 
 /* \summary: Dynamic Trunking Protocol (DTP) printer */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include <config.h>
 
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "addrtoname.h"
 #include "extract.h"
 
-static const char tstr[] = " [|dtp]";
 
 #define DTP_HEADER_LEN                 1
 #define DTP_DOMAIN_TLV                 0x0001
@@ -36,29 +34,25 @@ static const char tstr[] = " [|dtp]";
 #define DTP_NEIGHBOR_TLV               0x0004
 
 static const struct tok dtp_tlv_values[] = {
-    { DTP_DOMAIN_TLV, "Domain TLV"},
-    { DTP_STATUS_TLV, "Status TLV"},
-    { DTP_DTP_TYPE_TLV, "DTP type TLV"},
-    { DTP_NEIGHBOR_TLV, "Neighbor TLV"},
+    { DTP_DOMAIN_TLV, "Domain},
+    { DTP_STATUS_TLV, "Status},
+    { DTP_DTP_TYPE_TLV, "DTP type},
+    { DTP_NEIGHBOR_TLV, "Neighbor},
     { 0, NULL}
 };
 
 void
-dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
+dtp_print(netdissect_options *ndo, const u_char *tptr, u_int length)
 {
-    int type, len;
-    const u_char *tptr;
-
-    if (length < DTP_HEADER_LEN)
-        goto trunc;
-
-    tptr = pptr;
-
-    ND_TCHECK2(*tptr, DTP_HEADER_LEN);
+    ndo->ndo_protocol = "dtp";
+    if (length < DTP_HEADER_LEN) {
+        ND_PRINT("[zero packet length]");
+        goto invalid;
+    }
 
-    ND_PRINT((ndo, "DTPv%u, length %u",
-           (*tptr),
-           length));
+    ND_PRINT("DTPv%u, length %u",
+           GET_U_1(tptr),
+           length);
 
     /*
      * In non-verbose mode, just print version.
@@ -68,61 +62,59 @@ dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
     }
 
     tptr += DTP_HEADER_LEN;
+    length -= DTP_HEADER_LEN;
 
-    while (tptr < (pptr+length)) {
+    while (length) {
+        uint16_t type, len;
 
-        ND_TCHECK2(*tptr, 4);
-       type = EXTRACT_16BITS(tptr);
-        len  = EXTRACT_16BITS(tptr+2);
+        if (length < 4) {
+            ND_PRINT("[%u bytes remaining]", length);
+            goto invalid;
+        }
+       type = GET_BE_U_2(tptr);
+        len  = GET_BE_U_2(tptr + 2);
        /* XXX: should not be but sometimes it is, see the test captures */
         if (type == 0)
             return;
-        ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
+        ND_PRINT("\n\t%s (0x%04x) TLV, length %u",
                tok2str(dtp_tlv_values, "Unknown", type),
-               type, len));
+               type, len);
 
         /* infinite loop check */
-        if (len < 4)
+        if (len < 4 || len > length) {
+            ND_PRINT("[TLV length %u]", len);
             goto invalid;
-        ND_TCHECK2(*tptr, len);
+        }
 
         switch (type) {
        case DTP_DOMAIN_TLV:
-               ND_PRINT((ndo, ", "));
-               fn_printzp(ndo, tptr+4, len-4, pptr+length);
+               ND_PRINT(", ");
+               nd_printjnp(ndo, tptr+4, len-4);
                break;
 
        case DTP_STATUS_TLV:
        case DTP_DTP_TYPE_TLV:
-                if (len < 5)
+                if (len != 5)
                     goto invalid;
-                ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
+                ND_PRINT(", 0x%x", GET_U_1(tptr + 4));
                 break;
 
        case DTP_NEIGHBOR_TLV:
-                if (len < 10)
+                if (len != 10)
                     goto invalid;
-                ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
+                ND_PRINT(", %s", GET_MAC48_STRING(tptr+4));
                 break;
 
         default:
+            ND_TCHECK_LEN(tptr, len);
             break;
         }
         tptr += len;
+        length -= len;
     }
-
     return;
 
  invalid:
-    ND_PRINT((ndo, "%s", istr));
-    return;
- trunc:
-    ND_PRINT((ndo, "%s", tstr));
+    nd_print_invalid(ndo);
+    ND_TCHECK_LEN(tptr, length);
 }
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 4
- * End:
- */