X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/8b3d754999dc34c96cde79ee3fb961d8ae5d68b7..258fb362b92f0a61ab0fd5d8bc69fa798e7e1c8b:/print-ip.c diff --git a/print-ip.c b/print-ip.c index 2f0db62b..8d41e287 100644 --- a/print-ip.c +++ b/print-ip.c @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.139 2004-04-30 22:22:05 hannes Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.143 2004-08-27 03:57:40 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -72,7 +72,7 @@ ip_printroute(const char *type, register const u_char *cp, u_int length) } /* - * If source-routing is present, return the final destination. + * If source-routing is present and valid, return the final destination. * Otherwise, return IP destination. * * This is used for UDP and TCP pseudo-header in the checksum @@ -94,14 +94,15 @@ ip_finddst(const struct ip *ip) TCHECK(*cp); tt = *cp; - if (tt == IPOPT_NOP || tt == IPOPT_EOL) + if (tt == IPOPT_EOL) + break; + else if (tt == IPOPT_NOP) len = 1; else { TCHECK(cp[1]); len = cp[1]; - } - if (len < 2) { - return 0; + if (len < 2) + break; } TCHECK2(*cp, len); switch (tt) { @@ -109,15 +110,14 @@ ip_finddst(const struct ip *ip) case IPOPT_SSRR: case IPOPT_LSRR: if (len < 7) - return 0; + break; memcpy(&retval, cp + len - 4, 4); return retval; } } - return ip->ip_dst.s_addr; - trunc: - return 0; + memcpy(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + return retval; } static void @@ -388,7 +388,7 @@ ip_print(register const u_char *bp, register u_int length) if (IP_V(ip) == 6) printf(", wrong link-layer encapsulation"); } - else + else if (!eflag) printf("IP "); if ((u_char *)(ip + 1) > snapend) { @@ -396,7 +396,7 @@ ip_print(register const u_char *bp, register u_int length) return; } if (length < sizeof (struct ip)) { - (void)printf("truncated-ip %d", length); + (void)printf("truncated-ip %u", length); return; } hlen = IP_HL(ip) * 4; @@ -506,7 +506,7 @@ again: case IPPROTO_ESP: { int enh, padlen; - advance = esp_print(gndo, cp, (const u_char *)ip, &enh, &padlen); + advance = esp_print(gndo, cp, len, (const u_char *)ip, &enh, &padlen); if (advance <= 0) break; cp += advance;