From: Tiwei Bie <tiwei....@antgroup.com>

We rely on errno to determine if a syscall has failed. However,
the current signal handler may modify errno. Preserve errno within
the signal handler to ensure it remains async-signal safe.

Signed-off-by: Tiwei Bie <tiwei....@antgroup.com>
---
 arch/um/os-Linux/signal.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c
index 11f07f498270..217a71244b69 100644
--- a/arch/um/os-Linux/signal.c
+++ b/arch/um/os-Linux/signal.c
@@ -201,8 +201,11 @@ static void hard_handler(int sig, siginfo_t *si, void *p)
 {
        ucontext_t *uc = p;
        mcontext_t *mc = &uc->uc_mcontext;
+       int errno_saved = errno;
 
        (*handlers[sig])(sig, (struct siginfo *)si, mc);
+
+       errno = errno_saved;
 }
 
 void set_handler(int sig)
-- 
2.34.1


Reply via email to