瀏覽代碼

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec

Steffen Klassert says:

====================
pull request (net): ipsec 2017-11-01

1) Fix a memleak when a packet matches a policy
   without a matching state.

2) Reset the socket cached dst_entry when inserting
   a socket policy, otherwise the policy might be
   ignored. From Jonathan Basseri.

3) Fix GSO for a IPsec, GRE tunnel combination.
   We reset the encapsulation field at the skb
   too erly, as a result GRE does not segment
   GSO packets. Fix this by resetting the the
   encapsulation field right before the
   transformation where the inner headers get
   invalid.

Please pull or let me know if there are problems.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 7 年之前
父節點
當前提交
122f00cdc1
共有 3 個文件被更改,包括 4 次插入2 次删除
  1. 3 1
      net/xfrm/xfrm_output.c
  2. 0 1
      net/xfrm/xfrm_policy.c
  3. 1 0
      net/xfrm/xfrm_state.c

+ 3 - 1
net/xfrm/xfrm_output.c

@@ -105,6 +105,9 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
 		if (xfrm_offload(skb)) {
 		if (xfrm_offload(skb)) {
 			x->type_offload->encap(x, skb);
 			x->type_offload->encap(x, skb);
 		} else {
 		} else {
+			/* Inner headers are invalid now. */
+			skb->encapsulation = 0;
+
 			err = x->type->output(x, skb);
 			err = x->type->output(x, skb);
 			if (err == -EINPROGRESS)
 			if (err == -EINPROGRESS)
 				goto out;
 				goto out;
@@ -208,7 +211,6 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb)
 	int err;
 	int err;
 
 
 	secpath_reset(skb);
 	secpath_reset(skb);
-	skb->encapsulation = 0;
 
 
 	if (xfrm_dev_offload_ok(skb, x)) {
 	if (xfrm_dev_offload_ok(skb, x)) {
 		struct sec_path *sp;
 		struct sec_path *sp;

+ 0 - 1
net/xfrm/xfrm_policy.c

@@ -2076,7 +2076,6 @@ make_dummy_bundle:
 	xdst->num_xfrms = num_xfrms;
 	xdst->num_xfrms = num_xfrms;
 	memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols);
 	memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols);
 
 
-	dst_hold(&xdst->u.dst);
 	return xdst;
 	return xdst;
 
 
 inc_error:
 inc_error:

+ 1 - 0
net/xfrm/xfrm_state.c

@@ -2069,6 +2069,7 @@ int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen
 	if (err >= 0) {
 	if (err >= 0) {
 		xfrm_sk_policy_insert(sk, err, pol);
 		xfrm_sk_policy_insert(sk, err, pol);
 		xfrm_pol_put(pol);
 		xfrm_pol_put(pol);
+		__sk_dst_reset(sk);
 		err = 0;
 		err = 0;
 	}
 	}