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>
This commit is contained in:
Heinrich Schuchardt 2022-09-02 02:32:25 +02:00 committed by Simon Glass
parent 81da5042e5
commit a2a9317cbc

View File

@ -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);
}