summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-09-02 02:32:25 +0200
committerSimon Glass <sjg@chromium.org>2022-09-25 08:30:05 -0600
commita2a9317cbc396c19baea217e091960c56c13f2c7 (patch)
tree74de4071e04a8f350ca520f0345273156a5eacb9
parent81da5042e514bfd27516d3530dde4d62a6708ca4 (diff)
sandbox: unblock signal before calling execv()
The following faulty behavior was observed. The sandbox configured with CONFIG_SANDBOX_CRASH_RESET=y was invoked with ./u-boot -T -S After executing `exception undefined' the sandbox reboots. When executing `exception undefined' the sandbox exits with SIGSEGV. The expected behavior is that the sandbox should reboot again. If we are relaunching the sandbox in a signal handler, we have to unblock the respective signal before calling execv(). See signal(7) man-page. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--arch/sandbox/cpu/os.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index 01845e388d3..d6170adaf5e 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -1017,8 +1017,24 @@ void *os_find_text_base(void)
return base;
}
+/**
+ * os_unblock_signals() - unblock all signals
+ *
+ * If we are relaunching the sandbox in a signal handler, we have to unblock
+ * the respective signal before calling execv(). See signal(7) man-page.
+ */
+static void os_unblock_signals(void)
+{
+ sigset_t sigs;
+
+ sigfillset(&sigs);
+ sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+}
+
void os_relaunch(char *argv[])
{
+ os_unblock_signals();
+
execv(argv[0], argv);
os_exit(1);
}