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

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

commit f4683713327aaeab0656e3ea83814b44267bdc4a
Author: Ville Juven <ville.ju...@unikie.com>
AuthorDate: Tue Mar 28 13:58:31 2023 +0300

    sched/sem_waitirq: Swap user mappings to MMU when releasing semaphore
    
    sem_t is user memory and the correct mappings are needed to perform
    the semaphore wait interruption.
    
    Otherwise either a page fault, or access to the WRONG address environment
    happens.
---
 sched/semaphore/sem_waitirq.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/sched/semaphore/sem_waitirq.c b/sched/semaphore/sem_waitirq.c
index 2f0a0d8f54..7d69029010 100644
--- a/sched/semaphore/sem_waitirq.c
+++ b/sched/semaphore/sem_waitirq.c
@@ -28,6 +28,7 @@
 #include <assert.h>
 #include <errno.h>
 
+#include <nuttx/addrenv.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
 
@@ -71,6 +72,13 @@ void nxsem_wait_irq(FAR struct tcb_s *wtcb, int errcode)
   FAR struct tcb_s *rtcb = this_task();
   FAR sem_t *sem = wtcb->waitobj;
 
+#ifdef CONFIG_ARCH_ADDRENV
+  if (wtcb->addrenv_own)
+    {
+      addrenv_select(wtcb->addrenv_own);
+    }
+#endif
+
   /* It is possible that an interrupt/context switch beat us to the punch
    * and already changed the task's state.
    */
@@ -95,6 +103,13 @@ void nxsem_wait_irq(FAR struct tcb_s *wtcb, int errcode)
 
   dq_rem((FAR dq_entry_t *)wtcb, SEM_WAITLIST(sem));
 
+#ifdef CONFIG_ARCH_ADDRENV
+  if (wtcb->addrenv_own)
+    {
+      addrenv_restore();
+    }
+#endif
+
   /* Indicate that the wait is over. */
 
   wtcb->waitobj = NULL;

Reply via email to