diff options
-rw-r--r-- | sys/netinet6/icmp6.c | 6 | ||||
-rw-r--r-- | sys/netinet6/raw_ip6.c | 3 |
2 files changed, 6 insertions, 3 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index cdbc040..d71be64 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -1907,10 +1907,13 @@ icmp6_rip6_input(struct mbuf **mp, int off) if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) && !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src)) continue; + INP_RLOCK(in6p); if (in6p->in6p_icmp6filt && ICMP6_FILTER_WILLBLOCK(icmp6->icmp6_type, - in6p->in6p_icmp6filt)) + in6p->in6p_icmp6filt)) { + INP_RUNLOCK(in6p); continue; + } if (last) { struct mbuf *n = NULL; @@ -1970,7 +1973,6 @@ icmp6_rip6_input(struct mbuf **mp, int off) INP_RUNLOCK(last); } last = in6p; - INP_RLOCK(last); } INP_INFO_RUNLOCK(&ripcbinfo); if (last) { diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 5e9ab49..a9f5bd2 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -165,10 +165,12 @@ rip6_input(struct mbuf **mp, int *offp, int proto) if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) && !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src)) continue; + INP_RLOCK(in6p); if (in6p->in6p_cksum != -1) { rip6stat.rip6s_isum++; if (in6_cksum(m, proto, *offp, m->m_pkthdr.len - *offp)) { + INP_RUNLOCK(in6p); rip6stat.rip6s_badsum++; continue; } @@ -206,7 +208,6 @@ rip6_input(struct mbuf **mp, int *offp, int proto) INP_RUNLOCK(last); } last = in6p; - INP_RLOCK(last); } INP_INFO_RUNLOCK(&ripcbinfo); #ifdef IPSEC |