]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: purge error queues in socket destructors
authorHeitor Alves de Siqueira <halves@igalia.com>
Wed, 11 Feb 2026 18:03:35 +0000 (15:03 -0300)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 23 Feb 2026 20:30:16 +0000 (15:30 -0500)
When TX timestamping is enabled via SO_TIMESTAMPING, SKBs may be queued
into sk_error_queue and will stay there until consumed. If userspace never
gets to read the timestamps, or if the controller is removed unexpectedly,
these SKBs will leak.

Fix by adding skb_queue_purge() calls for sk_error_queue in affected
bluetooth destructors. RFCOMM does not currently use sk_error_queue.

Fixes: 134f4b39df7b ("Bluetooth: add support for skb TX SND/COMPLETION timestamping")
Reported-by: syzbot+7ff4013eabad1407b70a@syzkaller.appspotmail.com
Closes: https://syzbot.org/bug?extid=7ff4013eabad1407b70a
Cc: stable@vger.kernel.org
Signed-off-by: Heitor Alves de Siqueira <halves@igalia.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_sock.c
net/bluetooth/iso.c
net/bluetooth/l2cap_sock.c
net/bluetooth/sco.c

index 4e7bf63af9c5fb5c23249364b12fd80169a528c0..0290dea081f621782eb1a89512835430f1facf50 100644 (file)
@@ -2166,6 +2166,7 @@ static void hci_sock_destruct(struct sock *sk)
        mgmt_cleanup(sk);
        skb_queue_purge(&sk->sk_receive_queue);
        skb_queue_purge(&sk->sk_write_queue);
+       skb_queue_purge(&sk->sk_error_queue);
 }
 
 static const struct proto_ops hci_sock_ops = {
index 1459ab161fd2a9d1d59a7d94e080183bd3836c1e..a38d3774176d8ae81bf98868d4a8709e95a5d620 100644 (file)
@@ -746,6 +746,7 @@ static void iso_sock_destruct(struct sock *sk)
 
        skb_queue_purge(&sk->sk_receive_queue);
        skb_queue_purge(&sk->sk_write_queue);
+       skb_queue_purge(&sk->sk_error_queue);
 }
 
 static void iso_sock_cleanup_listen(struct sock *parent)
index 3ba3ce7eaa98a57786b6ef80a12cf1be1d78eab8..62ceda979f39467592beb37db78d608d49d1491b 100644 (file)
@@ -1817,6 +1817,7 @@ static void l2cap_sock_destruct(struct sock *sk)
 
        skb_queue_purge(&sk->sk_receive_queue);
        skb_queue_purge(&sk->sk_write_queue);
+       skb_queue_purge(&sk->sk_error_queue);
 }
 
 static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
index 87ba90336e803450e3d8810ba8f7ce7b89c53b87..cccfaf560317469ba041638b470f12eb488cc842 100644 (file)
@@ -470,6 +470,7 @@ static void sco_sock_destruct(struct sock *sk)
 
        skb_queue_purge(&sk->sk_receive_queue);
        skb_queue_purge(&sk->sk_write_queue);
+       skb_queue_purge(&sk->sk_error_queue);
 }
 
 static void sco_sock_cleanup_listen(struct sock *parent)