diff options
Diffstat (limited to 'net/xfrm')
| -rw-r--r-- | net/xfrm/xfrm_device.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_ipcomp.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 13 | ||||
| -rw-r--r-- | net/xfrm/xfrm_replay.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 5 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 21 | 
6 files changed, 24 insertions, 21 deletions
diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index 8e70291e586a..e87d6c4dd5b6 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -217,7 +217,7 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)  		if (skb->len <= mtu)  			goto ok; -		if (skb_is_gso(skb) && skb_gso_validate_mtu(skb, mtu)) +		if (skb_is_gso(skb) && skb_gso_validate_network_len(skb, mtu))  			goto ok;  	} diff --git a/net/xfrm/xfrm_ipcomp.c b/net/xfrm/xfrm_ipcomp.c index ccfdc7115a83..a00ec715aa46 100644 --- a/net/xfrm/xfrm_ipcomp.c +++ b/net/xfrm/xfrm_ipcomp.c @@ -283,7 +283,7 @@ static struct crypto_comp * __percpu *ipcomp_alloc_tfms(const char *alg_name)  		struct crypto_comp *tfm;  		/* This can be any valid CPU ID so we don't need locking. */ -		tfm = __this_cpu_read(*pos->tfms); +		tfm = this_cpu_read(*pos->tfms);  		if (!strcmp(crypto_comp_name(tfm), alg_name)) {  			pos->users++; diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 7a23078132cf..625b3fca5704 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1458,10 +1458,13 @@ xfrm_tmpl_resolve(struct xfrm_policy **pols, int npols, const struct flowi *fl,  static int xfrm_get_tos(const struct flowi *fl, int family)  {  	const struct xfrm_policy_afinfo *afinfo; -	int tos = 0; +	int tos;  	afinfo = xfrm_policy_get_afinfo(family); -	tos = afinfo ? afinfo->get_tos(fl) : 0; +	if (!afinfo) +		return 0; + +	tos = afinfo->get_tos(fl);  	rcu_read_unlock(); @@ -1891,7 +1894,7 @@ static void xfrm_policy_queue_process(struct timer_list *t)  	spin_unlock(&pq->hold_queue.lock);  	dst_hold(xfrm_dst_path(dst)); -	dst = xfrm_lookup(net, xfrm_dst_path(dst), &fl, sk, 0); +	dst = xfrm_lookup(net, xfrm_dst_path(dst), &fl, sk, XFRM_LOOKUP_QUEUE);  	if (IS_ERR(dst))  		goto purge_queue; @@ -2729,14 +2732,14 @@ static const void *xfrm_get_dst_nexthop(const struct dst_entry *dst,  	while (dst->xfrm) {  		const struct xfrm_state *xfrm = dst->xfrm; +		dst = xfrm_dst_child(dst); +  		if (xfrm->props.mode == XFRM_MODE_TRANSPORT)  			continue;  		if (xfrm->type->flags & XFRM_TYPE_REMOTE_COADDR)  			daddr = xfrm->coaddr;  		else if (!(xfrm->type->flags & XFRM_TYPE_LOCAL_COADDR))  			daddr = &xfrm->id.daddr; - -		dst = xfrm_dst_child(dst);  	}  	return daddr;  } diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 1d38c6acf8af..9e3a5e85f828 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c @@ -660,7 +660,7 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff  		} else {  			XFRM_SKB_CB(skb)->seq.output.low = oseq + 1;  			XFRM_SKB_CB(skb)->seq.output.hi = oseq_hi; -			xo->seq.low = oseq = oseq + 1; +			xo->seq.low = oseq + 1;  			xo->seq.hi = oseq_hi;  			oseq += skb_shinfo(skb)->gso_segs;  		} diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 54e21f19d722..f9d2f2233f09 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -2056,6 +2056,11 @@ int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen  	struct xfrm_mgr *km;  	struct xfrm_policy *pol = NULL; +#ifdef CONFIG_COMPAT +	if (in_compat_syscall()) +		return -EOPNOTSUPP; +#endif +  	if (!optval && !optlen) {  		xfrm_sk_policy_insert(sk, XFRM_POLICY_IN, NULL);  		xfrm_sk_policy_insert(sk, XFRM_POLICY_OUT, NULL); diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 7f52b8eb177d..080035f056d9 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -121,22 +121,17 @@ static inline int verify_replay(struct xfrm_usersa_info *p,  	struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];  	struct xfrm_replay_state_esn *rs; -	if (p->flags & XFRM_STATE_ESN) { -		if (!rt) -			return -EINVAL; +	if (!rt) +		return (p->flags & XFRM_STATE_ESN) ? -EINVAL : 0; -		rs = nla_data(rt); +	rs = nla_data(rt); -		if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8) -			return -EINVAL; - -		if (nla_len(rt) < (int)xfrm_replay_state_esn_len(rs) && -		    nla_len(rt) != sizeof(*rs)) -			return -EINVAL; -	} +	if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8) +		return -EINVAL; -	if (!rt) -		return 0; +	if (nla_len(rt) < (int)xfrm_replay_state_esn_len(rs) && +	    nla_len(rt) != sizeof(*rs)) +		return -EINVAL;  	/* As only ESP and AH support ESN feature. */  	if ((p->id.proto != IPPROTO_ESP) && (p->id.proto != IPPROTO_AH))  | 

