Commit c9efde1e authored by Votokina Victoria's avatar Votokina Victoria Committed by Jakub Kicinski
Browse files

nfc: hci: shdlc: Stop timers and work before freeing context



llc_shdlc_deinit() purges SHDLC skb queues and frees the llc_shdlc
structure while its timers and state machine work may still be active.

Timer callbacks can schedule sm_work, and sm_work accesses SHDLC state
and the skb queues. If teardown happens in parallel with a queued/running
work item, it can lead to UAF and other shutdown races.

Stop all SHDLC timers and cancel sm_work synchronously before purging the
queues and freeing the context.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: 4a61cd66 ("NFC: Add an shdlc llc module to llc core")
Signed-off-by: default avatarVotokina Victoria <Victoria.Votokina@kaspersky.com>
Link: https://patch.msgid.link/20260203113158.2008723-1-Victoria.Votokina@kaspersky.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e1aa5ef8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -762,6 +762,14 @@ static void llc_shdlc_deinit(struct nfc_llc *llc)
{
	struct llc_shdlc *shdlc = nfc_llc_get_data(llc);

	timer_shutdown_sync(&shdlc->connect_timer);
	timer_shutdown_sync(&shdlc->t1_timer);
	timer_shutdown_sync(&shdlc->t2_timer);
	shdlc->t1_active = false;
	shdlc->t2_active = false;

	cancel_work_sync(&shdlc->sm_work);

	skb_queue_purge(&shdlc->rcv_q);
	skb_queue_purge(&shdlc->send_q);
	skb_queue_purge(&shdlc->ack_pending_q);