From Eddie Kohler <xexd@sourceforge.net>: 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.
This commit is contained in:
guy 2004-06-25 01:20:08 +00:00
parent 65ff785f67
commit 6c02156d08
2 changed files with 11 additions and 10 deletions

View File

@ -34,6 +34,7 @@ Additional people who have contributed patches:
Darren Reed <darrenr@reed.wattle.id.au>
David Binderman <d.binderman@virgin.net>
David Young <dyoung@ojctech.com>
Eddie Kohler <xexd@sourceforge.net>
Francis Dupont <Francis.Dupont@enst-bretagne.fr>
Francisco Matias Cuenca-Acuna <mcuenca@george.rutgers.edu>
Frank Volf <volf@oasis.IAEhv.nl>

View File

@ -21,7 +21,7 @@
#ifndef lint
static const char rcsid[] _U_ =
"@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.140 2004-05-01 10:15:33 hannes Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.141 2004-06-25 01:20:09 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