summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authordd <dd@FreeBSD.org>2001-11-27 19:58:09 +0000
committerdd <dd@FreeBSD.org>2001-11-27 19:58:09 +0000
commitaeec5e42651c55da02aacf7c8dcf8fbf07a7a922 (patch)
treeb8685fe28a8e426de5c2055411e2ff916e8663bf /sys/netinet
parentda78f952f391aa86cf6f5b9b872501bc7d130c35 (diff)
downloadFreeBSD-src-aeec5e42651c55da02aacf7c8dcf8fbf07a7a922.zip
FreeBSD-src-aeec5e42651c55da02aacf7c8dcf8fbf07a7a922.tar.gz
In icmp_reflect(): If the packet was not addressed to us and was
received on an interface without an IP address, try to find a non-loopback AF_INET address to use. If that fails, drop it. Previously, we used the address at the top of the in_ifaddrhead list, which didn't make much sense, and would cause a panic if there were no AF_INET addresses configured on the system. PR: 29337, 30524 Reviewed by: ru, jlemon Obtained from: NetBSD
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_icmp.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c
index 331fe81..62bcd7e 100644
--- a/sys/netinet/ip_icmp.c
+++ b/sys/netinet/ip_icmp.c
@@ -623,10 +623,23 @@ icmp_reflect(m)
(struct sockaddr *)&icmpdst, m->m_pkthdr.rcvif);
/*
* The following happens if the packet was not addressed to us,
- * and was received on an interface with no IP address.
+ * and was received on an interface with no IP address:
+ * We find the first AF_INET address on the first non-loopback
+ * interface.
*/
if (ia == NULL)
- ia = TAILQ_FIRST(&in_ifaddrhead);
+ TAILQ_FOREACH(ia, &in_ifaddrhead, ia_link)
+ if ((ia->ia_ifp->if_flags & IFF_LOOPBACK) == 0)
+ break;
+
+ /*
+ * If we still didn't find an address, punt. We could have an
+ * interface up and (and receiving packets) with no address.
+ */
+ if (ia == NULL) {
+ m_freem(m);
+ goto done;
+ }
match:
t = IA_SIN(ia)->sin_addr;
ip->ip_src = t;
OpenPOWER on IntegriCloud