This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 36c0dce6d17613490b044cebc652cf20edbd3411
Author: yushuailong <[email protected]>
AuthorDate: Mon Sep 14 20:19:08 2026 +0800

    sched/irq: Cancel queued work before detaching worked IRQs.
    
    Remove pending IRQ work before clearing its callback state, and guard the
    worker callback against a concurrent detach.  This prevents detached worked
    IRQs from invoking a NULL function pointer.
    
    Assisted-by: OpenAI Codex
    Signed-off-by: yushuailong <[email protected]>
---
 sched/irq/irq_attach_wqueue.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/sched/irq/irq_attach_wqueue.c b/sched/irq/irq_attach_wqueue.c
index 4ea2ad73551..2585c2a972c 100644
--- a/sched/irq/irq_attach_wqueue.c
+++ b/sched/irq/irq_attach_wqueue.c
@@ -115,8 +115,12 @@ inline_function FAR struct kwork_wqueue_s 
*irq_get_wqueue(int priority)
 static void irq_work_handler(FAR void *arg)
 {
   FAR struct irq_work_info_s *info = arg;
+  xcpt_t isrwork = info->isrwork;
 
-  info->isrwork(info->irq, NULL, info->arg);
+  if (isrwork != NULL)
+    {
+      isrwork(info->irq, NULL, info->arg);
+    }
 }
 
 static int irq_default_handler(int irq, FAR void *context, FAR void *arg)
@@ -192,6 +196,11 @@ int irq_attach_wqueue(int irq, xcpt_t isr, xcpt_t isrwork,
       if (isrwork == NULL)
         {
           irq_detach(irq);
+          if (info->wqueue != NULL)
+            {
+              work_cancel_wq(info->wqueue, &info->work);
+            }
+
           info->isrwork = NULL;
           info->handler = NULL;
           info->arg     = NULL;

Reply via email to