From: Nguyen Dinh Phi Date: Thu, 7 Oct 2021 19:04:24 +0000 (+0800) Subject: Bluetooth: hci_sock: purge socket queues in the destruct() callback X-Git-Tag: baikal/mips/sdk5.8.2~229 X-Git-Url: https://git.baikalelectronics.ru/?a=commitdiff_plain;h=0d1035b9b24802c72c2b35265f96e897b4267734;p=kernel.git Bluetooth: hci_sock: purge socket queues in the destruct() callback commit 0be432fe20e7c4573ec6b8c8f609c0b99bac5614 upstream. The receive path may take the socket right before hci_sock_release(), but it may enqueue the packets to the socket queues after the call to skb_queue_purge(), therefore the socket can be destroyed without clear its queues completely. Moving these skb_queue_purge() to the hci_sock_destruct() will fix this issue, because nothing is referencing the socket at this point. Signed-off-by: Nguyen Dinh Phi Reported-by: syzbot+4c4ffd1e1094dae61035@syzkaller.appspotmail.com Signed-off-by: Marcel Holtmann Signed-off-by: Fedor Pchelkin Signed-off-by: Greg Kroah-Hartman --- diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index befab857a39be..a5205dc95e8fb 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -881,10 +881,6 @@ static int hci_sock_release(struct socket *sock) } sock_orphan(sk); - - skb_queue_purge(&sk->sk_receive_queue); - skb_queue_purge(&sk->sk_write_queue); - release_sock(sk); sock_put(sk); return 0; @@ -1985,6 +1981,12 @@ done: return err; } +static void hci_sock_destruct(struct sock *sk) +{ + skb_queue_purge(&sk->sk_receive_queue); + skb_queue_purge(&sk->sk_write_queue); +} + static const struct proto_ops hci_sock_ops = { .family = PF_BLUETOOTH, .owner = THIS_MODULE, @@ -2035,6 +2037,7 @@ static int hci_sock_create(struct net *net, struct socket *sock, int protocol, sock->state = SS_UNCONNECTED; sk->sk_state = BT_OPEN; + sk->sk_destruct = hci_sock_destruct; bt_sock_link(&hci_sk_list, sk); return 0;