From: Yaohan Li <shunsheng1218@gmail.com>
To: giometti@enneenne.com
Cc: akpm@linux-foundation.org, lasaine@lvk.cs.msu.su,
linux-kernel@vger.kernel.org
Subject: [PATCH] pps: parport: release port claim before unregistering PPS
Date: Wed, 04 Nov 2026 17:48:24 +0800 [thread overview]
Message-ID: <179378570450.72941.3525412815403628312@gmail.com> (raw)
parport_detach() unregisters the PPS source before releasing the
parallel-port claim. Disabling interrupts does not necessarily drain
an interrupt handler already in progress, and the handler can still
reference the PPS source after it has been released.
Release the parport claim first. parport_release() synchronizes with
interrupt handlers using the parport claim lock, so the PPS source
remains valid until the existing handler has completed. Unregister
the PPS source only after the claim has been released.
A KASAN test using the actual pps_parport detach and interrupt paths
reproduced the use-after-free before the change and did not report
it under the same injected interleaving after the change.
Fixes: a10203c691eac ("pps: add parallel port PPS client")
Assisted-by: ZCode:GLM-4
Signed-off-by: Yaohan Li <shunsheng1218@gmail.com>
---
drivers/pps/clients/pps_parport.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/pps/clients/pps_parport.c b/drivers/pps/clients/pps_parport.c
index f5af18bc2971a..8031446db8ada 100644
--- a/drivers/pps/clients/pps_parport.c
+++ b/drivers/pps/clients/pps_parport.c
@@ -209,8 +209,16 @@ static void parport_detach(struct parport *port)
device = pardev->private;
port->ops->disable_irq(port);
- pps_unregister_source(device->pps);
+ /*
+ * Release the port claim before unregistering the PPS source:
+ * parport_release() takes cad_lock for writing, which drains any
+ * in-flight interrupt handler (parport_generic_irq() calls our
+ * irq_func under cad_lock for reading, touching device->pps).
+ * With the old order the handler could still run after
+ * pps_unregister_source() had freed the pps_device.
+ */
parport_release(pardev);
+ pps_unregister_source(device->pps);
parport_unregister_device(pardev);
ida_free(&pps_client_index, device->index);
kfree(device);
--
2.34.1
reply other threads:[~2026-11-04 9:48 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=179378570450.72941.3525412815403628312@gmail.com \
--to=shunsheng1218@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=giometti@enneenne.com \
--cc=lasaine@lvk.cs.msu.su \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®