]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-process/signal: Add sigaltstack()
authorMichalis Pappas <michalis@unikraft.io>
Tue, 2 Jan 2024 17:53:21 +0000 (18:53 +0100)
committerUnikraft Bot <monkey@unikraft.io>
Wed, 26 Mar 2025 08:05:34 +0000 (08:05 +0000)
sigaltstack() allows setting or retrieving an alternative
signal stack context. For more info see sigaltstack(2)

Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Ioan-Teodor Teugea <ioan_teodor.teugea@stud.acs.upb.ro>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Reviewed-by: Andrei Tatar <andrei@unikraft.io>
Approved-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1248

lib/posix-process/Makefile.uk
lib/posix-process/exportsyms.uk
lib/posix-process/signal/sigaltstack.c [new file with mode: 0644]
lib/posix-process/signal/signal.c
lib/posix-process/signal/signal.h

index 977e42f66f47f778eb40ec7310c7f9769647b484..4d4b6b714f02e4994524c41cd7e21550971c8f92 100644 (file)
@@ -20,6 +20,7 @@ LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/wait.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signals.c
 
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/signal/signal.c
+LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/sigaltstack.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigprocmask.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigaction.c
 
@@ -35,6 +36,7 @@ LIBPOSIX_PROCESS_CXXINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include
 
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += clone-5e
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_EXECVE) += execve-3e
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += sigaltstack-2
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigprocmask-4
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigaction-4
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_VFORK) += vfork-2e
index f7cf4baffc751abf30a08109ae8ee09d1bcb6412..7a705d2c82f17ba3ebe9e5b942c137d0380a6d79 100644 (file)
@@ -42,4 +42,5 @@ uk_posix_process_create
 uk_posix_process_kill
 clone
 vfork
+sigaltstack
 sigprocmask
diff --git a/lib/posix-process/signal/sigaltstack.c b/lib/posix-process/signal/sigaltstack.c
new file mode 100644 (file)
index 0000000..3fe1553
--- /dev/null
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Copyright (c) 2023, Unikraft GmbH and The Unikraft Authors.
+ * Licensed under the BSD-3-Clause License (the "License").
+ * You may not use this file except in compliance with the License.
+ */
+
+#include <signal.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <uk/process.h>
+#include <uk/syscall.h>
+
+#include "signal.h"
+
+#if CONFIG_LIBPOSIX_PROCESS_SIGNAL
+UK_SYSCALL_R_DEFINE(int, sigaltstack, const stack_t *, ss,
+                   stack_t *, old_ss)
+{
+       struct posix_process *proc;
+
+       proc = uk_pprocess_current();
+       UK_ASSERT(proc);
+
+       if (ss) {
+               if (unlikely(ss->ss_flags &&
+                            !((unsigned int)ss->ss_flags == SS_AUTODISARM ||
+                              (unsigned int)ss->ss_flags == SS_DISABLE)))
+                       return -EINVAL;
+
+               if (unlikely(ss->ss_size < MINSIGSTKSZ))
+                       return -ENOMEM;
+
+               /* See BUGS in SIGALTSTACK(2) */
+               if (unlikely(ss->ss_flags & SS_ONSTACK))
+                       return -EPERM;
+
+               if (unlikely(proc->signal->altstack.ss_flags == SS_ONSTACK))
+                       return -EPERM;
+
+               if ((unsigned int)ss->ss_flags == SS_AUTODISARM)
+                       uk_pr_warn("SS_AUTODISARM stubbed\n");
+
+               if ((unsigned int)ss->ss_flags == SS_DISABLE) {
+                       proc->signal->altstack.ss_flags |= SS_DISABLE;
+                       return 0;
+               }
+
+               /* TODO Don't allow updating the altstack if we are executing
+                * on it already.
+                */
+
+               proc->signal->altstack = *ss;
+       }
+
+       if (old_ss)
+               *old_ss = proc->signal->altstack;
+
+       return 0;
+}
+
+#else /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+
+UK_SYSCALL_R_DEFINE(int, sigaltstack, const stack_t *, ss,
+                   stack_t *, old_ss)
+{
+       UK_WARN_STUBBED();
+       return 0;
+}
+#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
index 20b6ccaa358b3a26bcb35580f5c342f1d0ce4b8a..924f449c1a9bf4d763c858ab0e878da2d825020a 100644 (file)
@@ -214,6 +214,8 @@ int pprocess_signal_pdesc_init(struct posix_process *process)
        pprocess_signal_foreach(signum)
                pprocess_signal_sigaction_clear(KERN_SIGACTION(process, signum));
 
+       pd->altstack.ss_flags = SS_DISABLE;
+
        return 0;
 }
 
index bb6b7e518840e7f0e82f6d595eb7a3ebbdc3946b..d1695ed98a0bfbf688f499d8fd956a7d52585661 100644 (file)
@@ -155,6 +155,7 @@ struct uk_signal_queue {
 struct uk_signal_pdesc {
        __sz queued_count;
        __sz queued_max;
+       stack_t altstack;
        struct uk_signal_queue sigqueue;
        /* We use dynamically allocated memory for sigaction as passing
         * CLONE_SIGHAND to clone() requires that the parent and the child