diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/netfilter/ip6_tables.c | 5 | ||||
| -rw-r--r-- | net/ipv6/route.c | 9 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_policy.c | 8 | 
3 files changed, 17 insertions, 5 deletions
| diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 44400c216dc6..710238f58aa9 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -349,6 +349,11 @@ ip6t_do_table(struct sk_buff *skb,  	local_bh_disable();  	addend = xt_write_recseq_begin();  	private = table->private; +	/* +	 * Ensure we load private-> members after we've fetched the base +	 * pointer. +	 */ +	smp_read_barrier_depends();  	cpu        = smp_processor_id();  	table_base = private->entries[cpu];  	jumpstack  = (struct ip6t_entry **)private->jumpstack[cpu]; diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f54e3a101098..04e17b3309fb 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1087,10 +1087,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)  	if (rt->rt6i_genid != rt_genid_ipv6(dev_net(rt->dst.dev)))  		return NULL; -	if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) -		return dst; +	if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie)) +		return NULL; -	return NULL; +	if (rt6_check_expired(rt)) +		return NULL; + +	return dst;  }  static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 08ed2772b7aa..5f8e128c512d 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c @@ -135,10 +135,14 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)  	struct ipv6_opt_hdr *exthdr;  	const unsigned char *nh = skb_network_header(skb);  	u8 nexthdr = nh[IP6CB(skb)->nhoff]; +	int oif = 0; + +	if (skb_dst(skb)) +		oif = skb_dst(skb)->dev->ifindex;  	memset(fl6, 0, sizeof(struct flowi6));  	fl6->flowi6_mark = skb->mark; -	fl6->flowi6_oif = skb_dst(skb)->dev->ifindex; +	fl6->flowi6_oif = reverse ? skb->skb_iif : oif;  	fl6->daddr = reverse ? hdr->saddr : hdr->daddr;  	fl6->saddr = reverse ? hdr->daddr : hdr->saddr; @@ -285,7 +289,7 @@ static struct dst_ops xfrm6_dst_ops = {  	.destroy =		xfrm6_dst_destroy,  	.ifdown =		xfrm6_dst_ifdown,  	.local_out =		__ip6_local_out, -	.gc_thresh =		1024, +	.gc_thresh =		32768,  };  static struct xfrm_policy_afinfo xfrm6_policy_afinfo = { |