diff options
author | Heinrich Schuchardt <heinrich.schuchardt@canonical.com> | 2022-09-02 02:32:25 +0200 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2022-09-25 08:30:05 -0600 |
commit | a2a9317cbc396c19baea217e091960c56c13f2c7 (patch) | |
tree | 74de4071e04a8f350ca520f0345273156a5eacb9 | |
parent | 81da5042e514bfd27516d3530dde4d62a6708ca4 (diff) | |
download | u-boot-a2a9317cbc396c19baea217e091960c56c13f2c7.tar.gz u-boot-a2a9317cbc396c19baea217e091960c56c13f2c7.tar.bz2 u-boot-a2a9317cbc396c19baea217e091960c56c13f2c7.zip |
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.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c index 01845e388d..d6170adaf5 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); } |