]> The Tcpdump Group git mirrors - tcpdump/commitdiff
From Eddie Kohler <[email protected]>: In "ip_finddst()":
authorguy <guy>
Fri, 25 Jun 2004 01:20:08 +0000 (01:20 +0000)
committerguy <guy>
Fri, 25 Jun 2004 01:20:08 +0000 (01:20 +0000)
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.

CREDITS
print-ip.c

diff --git a/CREDITS b/CREDITS
index ce650dd37a90800f5992e9e623127291464e08c3..6c803e1913e7538a8c387ba587306c5714a0d4c5 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -34,6 +34,7 @@ Additional people who have contributed patches:
        Darren Reed                     <[email protected]>
        David Binderman                 <[email protected]>
        David Young                     <[email protected]>
+       Eddie Kohler                    <[email protected]>
        Francis Dupont                  <[email protected]>
        Francisco Matias Cuenca-Acuna   <[email protected]>
        Frank Volf                      <[email protected]>
index c1c1fda7a966bab4ca91d78972976d1ddb0f3755..f2ff35615bdd2ce230dce7312ab22624bdb9be6d 100644 (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