diff options
Diffstat (limited to 'contrib/tcpdump/print-bgp.c')
-rw-r--r-- | contrib/tcpdump/print-bgp.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/contrib/tcpdump/print-bgp.c b/contrib/tcpdump/print-bgp.c index 342292b..b14067d 100644 --- a/contrib/tcpdump/print-bgp.c +++ b/contrib/tcpdump/print-bgp.c @@ -33,7 +33,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.27 2001/10/18 09:52:17 itojun Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.27.2.1 2003/02/26 05:51:56 fenner Exp $"; #endif #include <sys/param.h> @@ -469,11 +469,19 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *dat, int len) switch (af) { case AFNUM_INET: advance = decode_prefix4(p, buf, sizeof(buf)); + if (advance < 0) { + p = dat + len; + break; + } printf(" %s", buf); break; #ifdef INET6 case AFNUM_INET6: advance = decode_prefix6(p, buf, sizeof(buf)); + if (advance < 0) { + p = dat + len; + break; + } printf(" %s", buf); break; #endif @@ -505,11 +513,19 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *dat, int len) switch (af) { case AFNUM_INET: advance = decode_prefix4(p, buf, sizeof(buf)); + if (advance < 0) { + p = dat + len; + break; + } printf(" %s", buf); break; #ifdef INET6 case AFNUM_INET6: advance = decode_prefix6(p, buf, sizeof(buf)); + if (advance < 0) { + p = dat + len; + break; + } printf(" %s", buf); break; #endif @@ -598,6 +614,7 @@ bgp_update_print(const u_char *dat, int length) printf(" (Withdrawn routes: %d bytes)", len); #else char buf[MAXHOSTNAMELEN + 100]; + int wpfx; TCHECK2(p[2], len); i = 2; @@ -605,7 +622,10 @@ bgp_update_print(const u_char *dat, int length) printf(" (Withdrawn routes:"); while(i < 2 + len) { - i += decode_prefix4(&p[i], buf, sizeof(buf)); + wpfx = decode_prefix4(&p[i], buf, sizeof(buf)); + if (wpfx < 0) + break; + i += wpfx; printf(" %s", buf); } printf(")\n"); @@ -666,9 +686,9 @@ bgp_update_print(const u_char *dat, int length) while (dat + length > p) { char buf[MAXHOSTNAMELEN + 100]; i = decode_prefix4(p, buf, sizeof(buf)); - printf(" %s", buf); if (i < 0) break; + printf(" %s", buf); p += i; } |