MDEV-16084 Calling exit() from a signal handler is unsafe.
Call _exit() from signal handler. main() can just do return.
This commit is contained in:
parent
a411910dd6
commit
1cb7c4bfc0
@ -89,7 +89,7 @@ static void die(const char* fmt, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void kill_child(bool was_killed)
|
static int kill_child(bool was_killed)
|
||||||
{
|
{
|
||||||
int status= 0;
|
int status= 0;
|
||||||
|
|
||||||
@ -108,15 +108,15 @@ static void kill_child(bool was_killed)
|
|||||||
exit_code= WEXITSTATUS(status);
|
exit_code= WEXITSTATUS(status);
|
||||||
message("Child exit: %d", exit_code);
|
message("Child exit: %d", exit_code);
|
||||||
// Exit with exit status of the child
|
// Exit with exit status of the child
|
||||||
exit(exit_code);
|
return exit_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WIFSIGNALED(status))
|
if (WIFSIGNALED(status))
|
||||||
message("Child killed by signal: %d", WTERMSIG(status));
|
message("Child killed by signal: %d", WTERMSIG(status));
|
||||||
|
|
||||||
exit(exit_code);
|
return exit_code;
|
||||||
}
|
}
|
||||||
exit(5);
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ extern "C" void handle_signal(int sig)
|
|||||||
terminated= 1;
|
terminated= 1;
|
||||||
|
|
||||||
if (child_pid > 0)
|
if (child_pid > 0)
|
||||||
kill_child(sig == SIGCHLD);
|
_exit(kill_child(sig == SIGCHLD));
|
||||||
|
|
||||||
// Ignore further signals
|
// Ignore further signals
|
||||||
signal(SIGTERM, SIG_IGN);
|
signal(SIGTERM, SIG_IGN);
|
||||||
@ -292,8 +292,6 @@ int main(int argc, char* const argv[] )
|
|||||||
/* Wait for parent or child to die */
|
/* Wait for parent or child to die */
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
kill_child(0);
|
return kill_child(0);
|
||||||
|
|
||||||
return 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user