X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/aad6ac30ce7904f688226dbc61021ca4f907274f..a63600a1fc28dbc7ae7ce9f996829c49a25fb33c:/print-ppp.c diff --git a/print-ppp.c b/print-ppp.c index fe036247..38505355 100644 --- a/print-ppp.c +++ b/print-ppp.c @@ -42,8 +42,6 @@ #include #endif -#include - #include "netdissect.h" #include "extract.h" #include "addrtoname.h" @@ -1133,7 +1131,7 @@ print_ipcp_config_options(netdissect_options *ndo, print_unknown_data(ndo, p + 2, "\n\t ", len - 2); break; } - if (ndo->ndo_vflag > 1) + if (ndo->ndo_vflag > 1 && ND_TTEST_LEN(p + 2, len - 2)) print_unknown_data(ndo, p + 2, "\n\t ", len - 2); /* exclude TLV header */ return len; @@ -1365,7 +1363,7 @@ ppp_hdlc(netdissect_options *ndo, u_char *b, *t, c; const u_char *s; u_int i, proto; - const void *se; + const void *sb, *se; if (caplen == 0) return; @@ -1379,7 +1377,7 @@ ppp_hdlc(netdissect_options *ndo, /* * Unescape all the data into a temporary, private, buffer. - * Do this so that we dont overwrite the original packet + * Do this so that we don't overwrite the original packet * contents. */ for (s = p, t = b, i = caplen; i != 0; i--) { @@ -1397,8 +1395,11 @@ ppp_hdlc(netdissect_options *ndo, /* * Change the end pointer, so bounds checks work. + * Change the pointer to packet data to help debugging. */ + sb = ndo->ndo_packetp; se = ndo->ndo_snapend; + ndo->ndo_packetp = b; ndo->ndo_snapend = t; length = ND_BYTES_AVAILABLE_AFTER(b); @@ -1427,18 +1428,26 @@ ppp_hdlc(netdissect_options *ndo, if (length < 4) goto trunc; proto = GET_BE_U_2(b + 2); /* load the PPP proto-id */ - handle_ppp(ndo, proto, b + 4, length - 4); + if ((proto & 0xff00) == 0x7e00) + ND_PRINT("(protocol 0x%04x invalid)", proto); + else + handle_ppp(ndo, proto, b + 4, length - 4); break; default: /* last guess - proto must be a PPP proto-id */ - handle_ppp(ndo, proto, b + 2, length - 2); + if ((proto & 0xff00) == 0x7e00) + ND_PRINT("(protocol 0x%04x invalid)", proto); + else + handle_ppp(ndo, proto, b + 2, length - 2); break; } cleanup: + ndo->ndo_packetp = sb; ndo->ndo_snapend = se; return; trunc: + ndo->ndo_packetp = sb; ndo->ndo_snapend = se; nd_print_trunc(ndo); } @@ -1561,11 +1570,18 @@ ppp_print(netdissect_options *ndo, hdr_len += 2; } - if (ndo->ndo_eflag) - ND_PRINT("%s (0x%04x), length %u: ", - tok2str(ppptype2str, "unknown", proto), + if (ndo->ndo_eflag) { + const char *typestr; + typestr = tok2str(ppptype2str, "unknown", proto); + ND_PRINT("%s (0x%04x), length %u", + typestr, proto, olen); + if (*typestr == 'u') /* "unknown" */ + return hdr_len; + + ND_PRINT(": "); + } handle_ppp(ndo, proto, p, length); return (hdr_len);