diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 6db60946c627..c0072f81e81a 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -1486,6 +1486,14 @@ static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) int err; lock_sock(sk); + sock_hold(sk); + l2cap_chan_hold(chan); + l2cap_chan_lock(chan); + if (sock_flag(sk, SOCK_DEAD)) { + err = -ENXIO; + goto done; + } + if (chan->mode == L2CAP_MODE_ERTM && !list_empty(&pi->rx_busy)) { err = -ENOMEM; @@ -1534,6 +1542,9 @@ static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) } done: + sock_put(sk); + l2cap_chan_unlock(chan); + l2cap_chan_put(chan); release_sock(sk); return err;