summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2008-08-25 22:12:38 +0000
committerAlexander Motin <mav@FreeBSD.org>2008-08-25 22:12:38 +0000
commit761a99c91b4005db3c1b6258b1b06402ab4ec461 (patch)
tree351c89da3d65fd53edb50ba8f4ac53394d570029 /sys
parentff778c677c414c5d3a537b24d36eeb1fae891636 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet6/icmp6.c21
-rw-r--r--sys/netinet6/raw_ip6.c18
2 files changed, 18 insertions, 21 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index a108a1d086a3..e752c3093d1a 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1889,24 +1889,23 @@ icmp6_rip6_input(struct mbuf **mp, int off)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_RLOCK(in6p);
- if ((in6p->inp_vflag & INP_IPV6) == 0) {
- docontinue:
- INP_RUNLOCK(in6p);
+ if ((in6p->inp_vflag & INP_IPV6) == 0)
continue;
- }
if (in6p->in6p_ip6_nxt != IPPROTO_ICMPV6)
- goto docontinue;
+ continue;
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &ip6->ip6_dst))
- goto docontinue;
+ continue;
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) &&
!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src))
- goto docontinue;
+ continue;
+ INP_RLOCK(in6p);
if (in6p->in6p_icmp6filt
&& ICMP6_FILTER_WILLBLOCK(icmp6->icmp6_type,
- in6p->in6p_icmp6filt))
- goto docontinue;
+ in6p->in6p_icmp6filt)) {
+ INP_RUNLOCK(in6p);
+ continue;
+ }
if (last) {
struct mbuf *n = NULL;
@@ -1967,6 +1966,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
}
last = in6p;
}
+ INP_INFO_RUNLOCK(&ripcbinfo);
if (last) {
if (last->in6p_flags & IN6P_CONTROLOPTS)
ip6_savecontrol(last, m, &opts);
@@ -2006,7 +2006,6 @@ icmp6_rip6_input(struct mbuf **mp, int off)
m_freem(m);
ip6stat.ip6s_delivered--;
}
- INP_INFO_RUNLOCK(&ripcbinfo);
return IPPROTO_DONE;
}
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index d5483af0007d..237aa18b214f 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -153,27 +153,25 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_RLOCK(in6p);
- if ((in6p->in6p_vflag & INP_IPV6) == 0) {
-docontinue:
- INP_RUNLOCK(in6p);
+ if ((in6p->in6p_vflag & INP_IPV6) == 0)
continue;
- }
if (in6p->in6p_ip6_nxt &&
in6p->in6p_ip6_nxt != proto)
- goto docontinue;
+ continue;
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &ip6->ip6_dst))
- goto docontinue;
+ continue;
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) &&
!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src))
- goto docontinue;
+ 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++;
- goto docontinue;
+ continue;
}
}
if (last) {
@@ -210,6 +208,7 @@ docontinue:
}
last = in6p;
}
+ INP_INFO_RUNLOCK(&ripcbinfo);
#ifdef IPSEC
/*
* Check AH/ESP integrity.
@@ -251,7 +250,6 @@ docontinue:
}
ip6stat.ip6s_delivered--;
}
- INP_INFO_RUNLOCK(&ripcbinfo);
return (IPPROTO_DONE);
}