summaryrefslogtreecommitdiffstats
path: root/src/kdc/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kdc/main.c')
-rw-r--r--src/kdc/main.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/kdc/main.c b/src/kdc/main.c
index c978a77a9c..15a5a9ee7f 100644
--- a/src/kdc/main.c
+++ b/src/kdc/main.c
@@ -536,6 +536,7 @@ terminate_workers(pid_t *pids, int bound, int num_active)
static krb5_error_code
create_workers(verto_ctx *ctx, int num)
{
+ krb5_error_code retval;
int i, status, numleft;
pid_t pid, *pids;
#ifdef POSIX_SIGNALS
@@ -551,6 +552,16 @@ create_workers(verto_ctx *ctx, int num)
pid = fork();
if (pid == 0) {
verto_reinitialize(ctx);
+ retval = loop_setup_signals(ctx, NULL, reset_for_hangup);
+ if (retval) {
+ krb5_klog_syslog(LOG_ERR, _("Unable to initialize signal "
+ "handlers in pid %d"), pid);
+ return retval;
+ }
+
+ /* Avoid race condition */
+ if (signal_received)
+ exit(0);
/* Return control to main() in the new worker process. */
free(pids);
@@ -984,7 +995,7 @@ int main(int argc, char **argv)
*/
initialize_realms(kcontext, argc, argv);
- ctx = loop_init(VERTO_EV_TYPE_NONE, NULL, reset_for_hangup);
+ ctx = loop_init(VERTO_EV_TYPE_NONE);
if (!ctx) {
kdc_err(kcontext, ENOMEM, _("while creating main loop"));
finish_realms();
@@ -1046,6 +1057,12 @@ int main(int argc, char **argv)
finish_realms();
return 1;
}
+ retval = loop_setup_signals(ctx, NULL, reset_for_hangup);
+ if (retval) {
+ kdc_err(kcontext, retval, _("while initializing signal handlers"));
+ finish_realms();
+ return 1;
+ }
}
if ((retval = loop_setup_network(ctx, NULL, kdc_progname))) {
net_init_error: