Skip to content

Commit

Permalink
l2tp: hold tunnel socket when handling control frames in l2tp_ip and …
Browse files Browse the repository at this point in the history
…l2tp_ip6

The code following l2tp_tunnel_find() expects that a new reference is
held on sk. Either sk_receive_skb() or the discard_put error path will
drop a reference from the tunnel's socket.

This issue exists in both l2tp_ip and l2tp_ip6.

Fixes: a3c1842 ("l2tp: hold socket before dropping lock in l2tp_ip{, 6}_recv()")
Signed-off-by: Guillaume Nault <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Guillaume Nault authored and davem330 committed Mar 29, 2017
1 parent b768b16 commit 94d7ee0
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
5 changes: 3 additions & 2 deletions net/l2tp/l2tp_ip.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,10 @@ static int l2tp_ip_recv(struct sk_buff *skb)

tunnel_id = ntohl(*(__be32 *) &skb->data[4]);
tunnel = l2tp_tunnel_find(net, tunnel_id);
if (tunnel != NULL)
if (tunnel) {
sk = tunnel->sock;
else {
sock_hold(sk);
} else {
struct iphdr *iph = (struct iphdr *) skb_network_header(skb);

read_lock_bh(&l2tp_ip_lock);
Expand Down
5 changes: 3 additions & 2 deletions net/l2tp/l2tp_ip6.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,9 +191,10 @@ static int l2tp_ip6_recv(struct sk_buff *skb)

tunnel_id = ntohl(*(__be32 *) &skb->data[4]);
tunnel = l2tp_tunnel_find(net, tunnel_id);
if (tunnel != NULL)
if (tunnel) {
sk = tunnel->sock;
else {
sock_hold(sk);
} else {
struct ipv6hdr *iph = ipv6_hdr(skb);

read_lock_bh(&l2tp_ip6_lock);
Expand Down

0 comments on commit 94d7ee0

Please sign in to comment.