mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-31 01:24:19 +02:00
cope with OS which don't fill in si_pid in siginfo
Icinga processes check si_pid on IPC signals to ensure that the signal comes from an expected process. OpenBSD doesn't currently fill in si_pid in siginfo (leaving it 0) so signals never pass this check, resulting in startup failing to complete (the worker doesn't see the umbrella's signal and vice-versa) - issue #7505. Relax the requirement so that either 0 or the wanted pid is accepted.
This commit is contained in:
parent
84891a6795
commit
6744b1af54
@ -324,14 +324,14 @@ static void UmbrellaSignalHandler(int num, siginfo_t *info, void*)
|
|||||||
break;
|
break;
|
||||||
case SIGUSR2:
|
case SIGUSR2:
|
||||||
if (l_CurrentlyStartingUnixWorkerState.load() == UnixWorkerState::Pending
|
if (l_CurrentlyStartingUnixWorkerState.load() == UnixWorkerState::Pending
|
||||||
&& info->si_pid == l_CurrentlyStartingUnixWorkerPid.load()) {
|
&& (info->si_pid == 0 || info->si_pid == l_CurrentlyStartingUnixWorkerPid.load()) ) {
|
||||||
// The seemless worker currently being started by StartUnixWorker() successfully loaded its config
|
// The seemless worker currently being started by StartUnixWorker() successfully loaded its config
|
||||||
l_CurrentlyStartingUnixWorkerState.store(UnixWorkerState::LoadedConfig);
|
l_CurrentlyStartingUnixWorkerState.store(UnixWorkerState::LoadedConfig);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SIGCHLD:
|
case SIGCHLD:
|
||||||
if (l_CurrentlyStartingUnixWorkerState.load() == UnixWorkerState::Pending
|
if (l_CurrentlyStartingUnixWorkerState.load() == UnixWorkerState::Pending
|
||||||
&& info->si_pid == l_CurrentlyStartingUnixWorkerPid.load()) {
|
&& (info->si_pid == 0 || info->si_pid == l_CurrentlyStartingUnixWorkerPid.load()) ) {
|
||||||
// The seemless worker currently being started by StartUnixWorker() failed
|
// The seemless worker currently being started by StartUnixWorker() failed
|
||||||
l_CurrentlyStartingUnixWorkerState.store(UnixWorkerState::Failed);
|
l_CurrentlyStartingUnixWorkerState.store(UnixWorkerState::Failed);
|
||||||
}
|
}
|
||||||
@ -368,14 +368,14 @@ static void WorkerSignalHandler(int num, siginfo_t *info, void*)
|
|||||||
{
|
{
|
||||||
switch (num) {
|
switch (num) {
|
||||||
case SIGUSR2:
|
case SIGUSR2:
|
||||||
if (info->si_pid == l_UmbrellaPid) {
|
if (info->si_pid == 0 || info->si_pid == l_UmbrellaPid) {
|
||||||
// The umbrella process allowed us to continue working beyond config validation
|
// The umbrella process allowed us to continue working beyond config validation
|
||||||
l_AllowedToWork.store(true);
|
l_AllowedToWork.store(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
if (info->si_pid == l_UmbrellaPid) {
|
if (info->si_pid == 0 || info->si_pid == l_UmbrellaPid) {
|
||||||
// The umbrella process requested our termination
|
// The umbrella process requested our termination
|
||||||
Application::RequestShutdown();
|
Application::RequestShutdown();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user