--- //depot/projects/netperf_socket/sys/netinet6/icmp6.c 2004/04/08 02:39:15 +++ //depot/user/rwatson/netperf/sys/netinet6/icmp6.c 2005/01/30 17:55:33 @@ -1909,21 +1909,26 @@ /* KAME hack: recover scopeid */ (void)in6_recoverscope(&fromsa, &ip6->ip6_src, m->m_pkthdr.rcvif); + INP_INFO_RLOCK(&ripcbinfo); LIST_FOREACH(in6p, &ripcb, inp_list) { - if ((in6p->inp_vflag & INP_IPV6) == 0) + INP_LOCK(in6p); + if ((in6p->inp_vflag & INP_IPV6) == 0) { + docontinue: + INP_UNLOCK(in6p); continue; + } if (in6p->in6p_ip6_nxt != IPPROTO_ICMPV6) - continue; + goto docontinue; if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) && !IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &ip6->ip6_dst)) - continue; + goto docontinue; if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) && !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src)) - continue; + goto docontinue; if (in6p->in6p_icmp6filt && ICMP6_FILTER_WILLBLOCK(icmp6->icmp6_type, in6p->in6p_icmp6filt)) - continue; + goto docontinue; if (last) { struct mbuf *n = NULL; @@ -1971,6 +1976,7 @@ sorwakeup(last->in6p_socket); opts = NULL; } + INP_UNLOCK(last); } last = in6p; } @@ -2002,10 +2008,12 @@ m_freem(opts); } else sorwakeup(last->in6p_socket); + INP_UNLOCK(last); } else { m_freem(m); ip6stat.ip6s_delivered--; } + INP_INFO_RUNLOCK(&ripcbinfo); return IPPROTO_DONE; }