diff options
| -rw-r--r-- | net/xfrm/xfrm_device.c | 1 | ||||
| -rw-r--r-- | net/xfrm/xfrm_input.c | 6 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 4 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 1 |
4 files changed, 8 insertions, 4 deletions
diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index acf00104ef31..30e5746085b8 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c | |||
| @@ -91,6 +91,7 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, | |||
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | if (!dev->xfrmdev_ops || !dev->xfrmdev_ops->xdo_dev_state_add) { | 93 | if (!dev->xfrmdev_ops || !dev->xfrmdev_ops->xdo_dev_state_add) { |
| 94 | xso->dev = NULL; | ||
| 94 | dev_put(dev); | 95 | dev_put(dev); |
| 95 | return 0; | 96 | return 0; |
| 96 | } | 97 | } |
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 2515cd2bc5db..8ac9d32fb79d 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
| @@ -429,7 +429,8 @@ resume: | |||
| 429 | nf_reset(skb); | 429 | nf_reset(skb); |
| 430 | 430 | ||
| 431 | if (decaps) { | 431 | if (decaps) { |
| 432 | skb->sp->olen = 0; | 432 | if (skb->sp) |
| 433 | skb->sp->olen = 0; | ||
| 433 | skb_dst_drop(skb); | 434 | skb_dst_drop(skb); |
| 434 | gro_cells_receive(&gro_cells, skb); | 435 | gro_cells_receive(&gro_cells, skb); |
| 435 | return 0; | 436 | return 0; |
| @@ -440,7 +441,8 @@ resume: | |||
| 440 | 441 | ||
| 441 | err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async); | 442 | err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async); |
| 442 | if (xfrm_gro) { | 443 | if (xfrm_gro) { |
| 443 | skb->sp->olen = 0; | 444 | if (skb->sp) |
| 445 | skb->sp->olen = 0; | ||
| 444 | skb_dst_drop(skb); | 446 | skb_dst_drop(skb); |
| 445 | gro_cells_receive(&gro_cells, skb); | 447 | gro_cells_receive(&gro_cells, skb); |
| 446 | return err; | 448 | return err; |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 0dab1cd79ce4..12213477cd3a 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
| @@ -732,12 +732,12 @@ restart: | |||
| 732 | } | 732 | } |
| 733 | } | 733 | } |
| 734 | } | 734 | } |
| 735 | out: | ||
| 736 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); | ||
| 735 | if (cnt) { | 737 | if (cnt) { |
| 736 | err = 0; | 738 | err = 0; |
| 737 | xfrm_policy_cache_flush(); | 739 | xfrm_policy_cache_flush(); |
| 738 | } | 740 | } |
| 739 | out: | ||
| 740 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); | ||
| 741 | return err; | 741 | return err; |
| 742 | } | 742 | } |
| 743 | EXPORT_SYMBOL(xfrm_state_flush); | 743 | EXPORT_SYMBOL(xfrm_state_flush); |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 2bfbd9121e3b..b997f1395357 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -657,6 +657,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 657 | 657 | ||
| 658 | if (err < 0) { | 658 | if (err < 0) { |
| 659 | x->km.state = XFRM_STATE_DEAD; | 659 | x->km.state = XFRM_STATE_DEAD; |
| 660 | xfrm_dev_state_delete(x); | ||
| 660 | __xfrm_state_put(x); | 661 | __xfrm_state_put(x); |
| 661 | goto out; | 662 | goto out; |
| 662 | } | 663 | } |
