From 6f813ec830ac7e6e726496d13eac9b71403ba93d Mon Sep 17 00:00:00 2001 From: Fedor Pchelkin Date: Wed, 24 Apr 2024 15:50:27 +0800 Subject: [PATCH] nfc: nci: free rx_data_reassembly skb on NCI device cleanup stable inclusion from stable-v5.10.210 commit 2f6d16f0520d6505241629ee2f5c131b547d5f9d category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/I9HJUW CVE: CVE-2024-26825 Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=2f6d16f0520d6505241629ee2f5c131b547d5f9d -------------------------------- commit bfb007aebe6bff451f7f3a4be19f4f286d0d5d9c upstream. rx_data_reassembly skb is stored during NCI data exchange for processing fragmented packets. It is dropped only when the last fragment is processed or when an NTF packet with NCI_OP_RF_DEACTIVATE_NTF opcode is received. However, the NCI device may be deallocated before that which leads to skb leak. As by design the rx_data_reassembly skb is bound to the NCI device and nothing prevents the device to be freed before the skb is processed in some way and cleaned, free it on the NCI device cleanup. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: 6a2968aaf50c ("NFC: basic NCI protocol implementation") Cc: stable@vger.kernel.org Reported-by: syzbot+6b7c68d9c21e4ee4251b@syzkaller.appspotmail.com Closes: https://lore.kernel.org/lkml/000000000000f43987060043da7b@google.com/ Signed-off-by: Fedor Pchelkin Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman Signed-off-by: Wang Hai Signed-off-by: Zheng Yejian (cherry picked from commit acccc82ad4d5fb93aa11aec238e6b43f3a24efc9) --- net/nfc/nci/core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c index 9e524884d4ac4..5d2718cf08046 100644 --- a/net/nfc/nci/core.c +++ b/net/nfc/nci/core.c @@ -1197,6 +1197,10 @@ void nci_free_device(struct nci_dev *ndev) { nfc_free_device(ndev->nfc_dev); nci_hci_deallocate(ndev); + + /* drop partial rx data packet if present */ + if (ndev->rx_data_reassembly) + kfree_skb(ndev->rx_data_reassembly); kfree(ndev); } EXPORT_SYMBOL(nci_free_device); -- Gitee