summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-l2tp.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump/print-l2tp.c')
-rw-r--r--contrib/tcpdump/print-l2tp.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/contrib/tcpdump/print-l2tp.c b/contrib/tcpdump/print-l2tp.c
index a4036d1..52766b5 100644
--- a/contrib/tcpdump/print-l2tp.c
+++ b/contrib/tcpdump/print-l2tp.c
@@ -23,7 +23,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-l2tp.c,v 1.17 2003/12/26 23:20:58 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-l2tp.c,v 1.17.2.2 2005/04/20 21:50:16 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -617,10 +617,10 @@ l2tp_print(const u_char *dat, u_int length)
const u_int16_t *ptr = (u_int16_t *)dat;
u_int cnt = 0; /* total octets consumed */
u_int16_t pad;
- int flag_t, flag_l, flag_s, flag_o, flag_p;
+ int flag_t, flag_l, flag_s, flag_o;
u_int16_t l2tp_len;
- flag_t = flag_l = flag_s = flag_o = flag_p = FALSE;
+ flag_t = flag_l = flag_s = flag_o = FALSE;
TCHECK(*ptr); /* Flags & Version */
if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {
@@ -650,10 +650,8 @@ l2tp_print(const u_char *dat, u_int length)
flag_o = TRUE;
printf("O");
}
- if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY) {
- flag_p = TRUE;
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY)
printf("P");
- }
printf("]");
ptr++;
@@ -690,7 +688,22 @@ l2tp_print(const u_char *dat, u_int length)
cnt += (2 + pad);
}
+ if (flag_l) {
+ if (length < l2tp_len) {
+ printf(" Length %u larger than packet", l2tp_len);
+ return;
+ }
+ length = l2tp_len;
+ }
+ if (length < cnt) {
+ printf(" Length %u smaller than header length", length);
+ return;
+ }
if (flag_t) {
+ if (!flag_l) {
+ printf(" No length");
+ return;
+ }
if (length - cnt == 0) {
printf(" ZLB");
} else {
OpenPOWER on IntegriCloud