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 1c09f383f1b8a111bef90f7c18c691c61b8372e7
Author: Bowen Wang <[email protected]>
AuthorDate: Tue Jul 29 21:12:34 2025 +0800

    rpmsg/rpmsg_port: read the list counters under the list lock
    
    rpmsg_port_add_node() and rpmsg_port_remove_node() update free.num and
    ready.num under the list spinlock, but rpmsg_port_queue_navail() and
    rpmsg_port_queue_nused() read them with atomic_read(), which does not
    synchronize with that lock. Read each counter under its own list lock.
    
    Signed-off-by: Bowen Wang <[email protected]>
---
 drivers/rpmsg/rpmsg_port.h | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/rpmsg/rpmsg_port.h b/drivers/rpmsg/rpmsg_port.h
index 02f6072fd9b..462af29db39 100644
--- a/drivers/rpmsg/rpmsg_port.h
+++ b/drivers/rpmsg/rpmsg_port.h
@@ -251,7 +251,13 @@ void rpmsg_port_queue_add_buffer(FAR struct 
rpmsg_port_queue_s *queue,
 static inline_function
 uint16_t rpmsg_port_queue_navail(FAR struct rpmsg_port_queue_s *queue)
 {
-  return atomic_read(&queue->free.num);
+  irqstate_t flags;
+  uint16_t num;
+
+  flags = spin_lock_irqsave(&queue->free.lock);
+  num = queue->free.num;
+  spin_unlock_irqrestore(&queue->free.lock, flags);
+  return num;
 }
 
 /****************************************************************************
@@ -271,7 +277,13 @@ uint16_t rpmsg_port_queue_navail(FAR struct 
rpmsg_port_queue_s *queue)
 static inline_function
 uint16_t rpmsg_port_queue_nused(FAR struct rpmsg_port_queue_s *queue)
 {
-  return atomic_read(&queue->ready.num);
+  irqstate_t flags;
+  uint16_t num;
+
+  flags = spin_lock_irqsave(&queue->ready.lock);
+  num = queue->ready.num;
+  spin_unlock_irqrestore(&queue->ready.lock, flags);
+  return num;
 }
 
 /****************************************************************************

Reply via email to