]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ppp.c
change make check to work with POSIX shell
[tcpdump] / print-ppp.c
index 078f6a56c02a3bae4857b4cd80aaaf30c6453dd5..891761728bbb7450368c7b838e8a82c1d7c681bd 100644 (file)
@@ -22,6 +22,8 @@
  * complete PPP support.
  */
 
+/* \summary: Point to Point Protocol (PPP) printer */
+
 /*
  * TODO:
  * o resolve XXX as much as possible
@@ -609,7 +611,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 6)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 3);
+               ND_TCHECK_24BITS(p + 2);
                ND_PRINT((ndo, ": Vendor: %s (%u)",
                        tok2str(oui_values,"Unknown",EXTRACT_24BITS(p+2)),
                        EXTRACT_24BITS(p + 2)));
@@ -628,7 +630,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 4)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p + 2);
                ND_PRINT((ndo, ": %u", EXTRACT_16BITS(p + 2)));
                break;
        case LCPOPT_ACCM:
@@ -636,7 +638,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 6)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 4);
+               ND_TCHECK_32BITS(p + 2);
                ND_PRINT((ndo, ": 0x%08x", EXTRACT_32BITS(p + 2)));
                break;
        case LCPOPT_AP:
@@ -644,7 +646,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 4)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p + 2);
                ND_PRINT((ndo, ": %s", tok2str(ppptype2str, "Unknown Auth Proto (0x04x)", EXTRACT_16BITS(p + 2))));
 
                switch (EXTRACT_16BITS(p+2)) {
@@ -666,7 +668,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 4)"));
                        return 0;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p+2);
                if (EXTRACT_16BITS(p+2) == PPP_LQM)
                        ND_PRINT((ndo, ": LQR"));
                else
@@ -677,7 +679,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 6)"));
                        return 0;
                }
-               ND_TCHECK2(*(p + 2), 4);
+               ND_TCHECK_32BITS(p + 2);
                ND_PRINT((ndo, ": 0x%08x", EXTRACT_32BITS(p + 2)));
                break;
        case LCPOPT_PFC:
@@ -689,7 +691,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 4)"));
                        return 0;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p + 2);
                ND_PRINT((ndo, ": 0x%04x", EXTRACT_16BITS(p + 2)));
                break;
        case LCPOPT_CBACK:
@@ -708,7 +710,7 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 4)"));
                        return 0;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p + 2);
                ND_PRINT((ndo, ": %u", EXTRACT_16BITS(p + 2)));
                break;
        case LCPOPT_MLED:
@@ -809,6 +811,15 @@ handle_mlppp(netdissect_options *ndo,
     if (!ndo->ndo_eflag)
         ND_PRINT((ndo, "MLPPP, "));
 
+    if (length < 2) {
+        ND_PRINT((ndo, "[|mlppp]"));
+        return;
+    }
+    if (!ND_TTEST_16BITS(p)) {
+        ND_PRINT((ndo, "[|mlppp]"));
+        return;
+    }
+
     ND_PRINT((ndo, "seq 0x%03x, Flags [%s], length %u",
            (EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */
            bittok2str(ppp_ml_flag_values, "none", *p & 0xc0),
@@ -942,6 +953,9 @@ handle_pap(netdissect_options *ndo,
 
        switch (code) {
        case PAP_AREQ:
+               /* A valid Authenticate-Request is 6 or more octets long. */
+               if (len < 6)
+                       goto trunc;
                if (length - (p - p0) < 1)
                        return;
                ND_TCHECK(*p);
@@ -970,6 +984,13 @@ handle_pap(netdissect_options *ndo,
                break;
        case PAP_AACK:
        case PAP_ANAK:
+               /* Although some implementations ignore truncation at
+                * this point and at least one generates a truncated
+                * packet, RFC 1334 section 2.2.2 clearly states that
+                * both AACK and ANAK are at least 5 bytes long.
+                */
+               if (len < 5)
+                       goto trunc;
                if (length - (p - p0) < 1)
                        return;
                ND_TCHECK(*p);
@@ -1043,7 +1064,7 @@ print_ipcp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 4)"));
                        return 0;
                }
-               ND_TCHECK2(*(p + 2), 2);
+               ND_TCHECK_16BITS(p+2);
                compproto = EXTRACT_16BITS(p+2);
 
                ND_PRINT((ndo, ": %s (0x%02x):",
@@ -1229,7 +1250,7 @@ print_ccp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 3)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 1);
+               ND_TCHECK(p[2]);
                ND_PRINT((ndo, ": Version: %u, Dictionary Bits: %u",
                        p[2] >> 5, p[2] & 0x1f));
                break;
@@ -1238,7 +1259,7 @@ print_ccp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 4)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 1);
+               ND_TCHECK(p[3]);
                ND_PRINT((ndo, ": Features: %u, PxP: %s, History: %u, #CTX-ID: %u",
                                (p[2] & 0xc0) >> 6,
                                (p[2] & 0x20) ? "Enabled" : "Disabled",
@@ -1249,10 +1270,10 @@ print_ccp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be >= 4)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 1);
+               ND_TCHECK(p[3]);
                ND_PRINT((ndo, ": Window: %uK, Method: %s (0x%x), MBZ: %u, CHK: %u",
                        (p[2] & 0xf0) >> 4,
-                       ((p[2] & 0x0f) == 8) ? "zlib" : "unkown",
+                       ((p[2] & 0x0f) == 8) ? "zlib" : "unknown",
                        p[2] & 0x0f, (p[3] & 0xfc) >> 2, p[3] & 0x03));
                break;
 
@@ -1324,7 +1345,7 @@ print_bacp_config_options(netdissect_options *ndo,
                        ND_PRINT((ndo, " (length bogus, should be = 6)"));
                        return len;
                }
-               ND_TCHECK2(*(p + 2), 4);
+               ND_TCHECK_32BITS(p + 2);
                ND_PRINT((ndo, ": Magic-Num 0x%08x", EXTRACT_32BITS(p + 2)));
                break;
        default:
@@ -1472,7 +1493,7 @@ handle_ppp(netdissect_options *ndo,
                ipx_print(ndo, p, length);
                break;
        case PPP_OSI:
-               isoclns_print(ndo, p, length, length);
+               isoclns_print(ndo, p, length);
                break;
        case PPP_MPLS_UCAST:
        case PPP_MPLS_MCAST:
@@ -1669,6 +1690,11 @@ ppp_hdlc_if_print(netdissect_options *ndo,
                return (chdlc_if_print(ndo, h, p));
 
        default:
+               if (caplen < 4) {
+                       ND_PRINT((ndo, "[|ppp]"));
+                       return (caplen);
+               }
+
                if (ndo->ndo_eflag)
                        ND_PRINT((ndo, "%02x %02x %d ", p[0], p[1], length));
                p += 2;