Skip to content

Commit 93b0319

Browse files
committed
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
Steffen Klassert says: ==================== pull request (net): ipsec 2017-10-09 1) Fix some error paths of the IPsec offloading API. 2) Fix a NULL pointer dereference when IPsec is used with vti. From Alexey Kodanev. 3) Don't call xfrm_policy_cache_flush under xfrm_state_lock, it triggers several locking warnings. From Artem Savkov. Please pull or let me know if there are problems. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 6c0e728 + dd269db commit 93b0319

File tree

4 files changed

+8
-4
lines changed

4 files changed

+8
-4
lines changed

net/xfrm/xfrm_device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
9191
}
9292

9393
if (!dev->xfrmdev_ops || !dev->xfrmdev_ops->xdo_dev_state_add) {
94+
xso->dev = NULL;
9495
dev_put(dev);
9596
return 0;
9697
}

net/xfrm/xfrm_input.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,8 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
429429
nf_reset(skb);
430430

431431
if (decaps) {
432-
skb->sp->olen = 0;
432+
if (skb->sp)
433+
skb->sp->olen = 0;
433434
skb_dst_drop(skb);
434435
gro_cells_receive(&gro_cells, skb);
435436
return 0;
@@ -440,7 +441,8 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
440441

441442
err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async);
442443
if (xfrm_gro) {
443-
skb->sp->olen = 0;
444+
if (skb->sp)
445+
skb->sp->olen = 0;
444446
skb_dst_drop(skb);
445447
gro_cells_receive(&gro_cells, skb);
446448
return err;

net/xfrm/xfrm_state.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,12 +732,12 @@ int xfrm_state_flush(struct net *net, u8 proto, bool task_valid)
732732
}
733733
}
734734
}
735+
out:
736+
spin_unlock_bh(&net->xfrm.xfrm_state_lock);
735737
if (cnt) {
736738
err = 0;
737739
xfrm_policy_cache_flush();
738740
}
739-
out:
740-
spin_unlock_bh(&net->xfrm.xfrm_state_lock);
741741
return err;
742742
}
743743
EXPORT_SYMBOL(xfrm_state_flush);

net/xfrm/xfrm_user.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh,
657657

658658
if (err < 0) {
659659
x->km.state = XFRM_STATE_DEAD;
660+
xfrm_dev_state_delete(x);
660661
__xfrm_state_put(x);
661662
goto out;
662663
}

0 commit comments

Comments
 (0)