From aeec5e42651c55da02aacf7c8dcf8fbf07a7a922 Mon Sep 17 00:00:00 2001 From: dd Date: Tue, 27 Nov 2001 19:58:09 +0000 Subject: 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 --- sys/netinet/ip_icmp.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'sys/netinet') 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; -- cgit v1.1