From 12ba2eeb23bcabd49bc77a70c9db2e5cf82492ad Mon Sep 17 00:00:00 2001
From: Ville Juven <ville.juven@unikie.com>
Date: Mon, 26 Aug 2024 16:18:27 +0300
Subject: [PATCH] arm64_checkstack.c: Fix traversing of user stack when
 ARCH_ADDRENV=Y

Need to instantiate the correct address environment when reading from
user stack, otherwise the result is very likely a crash
---
 arch/arm64/src/common/arm64_checkstack.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/src/common/arm64_checkstack.c b/arch/arm64/src/common/arm64_checkstack.c
index 8a39f1e199..c9cc227c92 100644
--- a/arch/arm64/src/common/arm64_checkstack.c
+++ b/arch/arm64/src/common/arm64_checkstack.c
@@ -198,7 +198,27 @@ void arm64_stack_color(void *stackbase, size_t nbytes)
 
 size_t up_check_tcbstack(struct tcb_s *tcb)
 {
-  return arm64_stack_check(tcb->stack_base_ptr, tcb->adj_stack_size);
+  size_t size;
+
+#ifdef CONFIG_ARCH_ADDRENV
+  struct addrenv_s *oldenv;
+
+  if (tcb->addrenv_own != NULL)
+    {
+      addrenv_select(tcb->addrenv_own, &oldenv);
+    }
+#endif
+
+  size = arm64_stack_check(tcb->stack_base_ptr, tcb->adj_stack_size);
+
+#ifdef CONFIG_ARCH_ADDRENV
+  if (tcb->addrenv_own != NULL)
+    {
+      addrenv_restore(oldenv);
+    }
+#endif
+
+  return size;
 }
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 7