From: guy Date: Fri, 25 Jun 2004 01:21:06 +0000 (+0000) Subject: From Eddie Kohler : In "ip_finddst()": X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/c451929916521bca3280b171fff52d1e2caba54b From Eddie Kohler : In "ip_finddst()": quit as soon as we see IPOPT_EOL; *don't* quit as soon as we see IPOPT_NOP, just advance to the next option, if any; implement "quit" as "return the destination address from the IP header rather than as "return 0". Also, return the IP header destination address if we see a source-routing option with a too-short length. --- diff --git a/CREDITS b/CREDITS index 57680532..b8f572ae 100644 --- a/CREDITS +++ b/CREDITS @@ -33,6 +33,7 @@ Additional people who have contributed patches: Darren Reed David Binderman David Young + Eddie Kohler Francis Dupont Francisco Matias Cuenca-Acuna Frank Volf diff --git a/print-ip.c b/print-ip.c index 4773d363..8422f0d9 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.128.2.6 2004-03-24 09:01:39 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.128.2.7 2004-06-25 01:21:06 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