Skip to content

Commit

Permalink
l2tp: hold socket before dropping lock in l2tp_ip{, 6}_recv()
Browse files Browse the repository at this point in the history
Socket must be held while under the protection of the l2tp lock; there
is no guarantee that sk remains valid after the read_unlock_bh() call.

Same issue for l2tp_ip and l2tp_ip6.

Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Guillaume Nault authored and David S. Miller committed Nov 30, 2016
1 parent 0382a25 commit a3c1842
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 10 deletions.
11 changes: 6 additions & 5 deletions net/l2tp/l2tp_ip.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,15 @@ static int l2tp_ip_recv(struct sk_buff *skb)

read_lock_bh(&l2tp_ip_lock);
sk = __l2tp_ip_bind_lookup(net, iph->daddr, 0, tunnel_id);
if (!sk) {
read_unlock_bh(&l2tp_ip_lock);
goto discard;
}

sock_hold(sk);
read_unlock_bh(&l2tp_ip_lock);
}

if (sk == NULL)
goto discard;

sock_hold(sk);

if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
goto discard_put;

Expand Down
11 changes: 6 additions & 5 deletions net/l2tp/l2tp_ip6.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,15 @@ static int l2tp_ip6_recv(struct sk_buff *skb)
read_lock_bh(&l2tp_ip6_lock);
sk = __l2tp_ip6_bind_lookup(net, &iph->daddr,
0, tunnel_id);
if (!sk) {
read_unlock_bh(&l2tp_ip6_lock);
goto discard;
}

sock_hold(sk);
read_unlock_bh(&l2tp_ip6_lock);
}

if (sk == NULL)
goto discard;

sock_hold(sk);

if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
goto discard_put;

Expand Down

0 comments on commit a3c1842

Please sign in to comment.