mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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®