diff --git a/src/core/main.c b/src/core/main.c index 2a294c67f..2f4548502 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1748,6 +1748,7 @@ finish: if (reexecute) { const char **args; unsigned i, args_size; + sigset_t ss, o_ss; /* Close and disarm the watchdog, so that the new * instance can reinitialize it, but doesn't get @@ -1831,6 +1832,11 @@ finish: args[i++] = NULL; assert(i <= args_size); + /* reenable any blocked signals, especially important + * if we switch from initial ramdisk to init=... */ + sigemptyset(&ss); + sigprocmask(SIG_SETMASK, &ss, &o_ss); + if (switch_root_init) { args[0] = switch_root_init; execv(args[0], (char* const*) args); @@ -1849,6 +1855,8 @@ finish: log_error("Failed to execute /bin/sh, giving up: %m"); } else log_warning("Failed to execute /sbin/init, giving up: %m"); + + sigprocmask(SIG_SETMASK, &o_ss, NULL); } if (serialization)