From e41e9b37e4d3fcd8544fb6c591dafbaef0954438 Mon Sep 17 00:00:00 2001 From: Alexey Tikhonov Date: Dec 14 2019 01:04:09 +0000 Subject: data_provider_be: got rid of duplicating SIGTERM handler It was wrong to install two libtevent SIGTERM handlers both of which did orderly_shutdown()->exit(). Naturally only one of the handlers was executed (as process was terminated with exit()) and libtevent docs doesn't say anything about order of execution. But chances are, be_process_finalize() was executed first so default_quit() was not executed and main_ctx was not freed. Moreover there is just no reason to have separate be_process_finalize() at all: default server handler default_quit() frees main_ctx. And be_ctx is linked to main_ctx so will be freed by default handler as well. Resolves: https://pagure.io/SSSD/sssd/issue/4088 Reviewed-by: Michal Židek --- diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c index cfcf026..ce00231 100644 --- a/src/providers/data_provider_be.c +++ b/src/providers/data_provider_be.c @@ -445,36 +445,6 @@ be_register_monitor_iface(struct sbus_connection *conn, struct be_ctx *be_ctx) return sbus_connection_add_path_map(be_ctx->mon_conn, paths); } -static void be_process_finalize(struct tevent_context *ev, - struct tevent_signal *se, - int signum, - int count, - void *siginfo, - void *private_data) -{ - struct be_ctx *be_ctx; - - be_ctx = talloc_get_type(private_data, struct be_ctx); - talloc_free(be_ctx); - orderly_shutdown(0); -} - -static errno_t be_process_install_sigterm_handler(struct be_ctx *be_ctx) -{ - struct tevent_signal *sige; - - BlockSignals(false, SIGTERM); - - sige = tevent_add_signal(be_ctx->ev, be_ctx, SIGTERM, SA_SIGINFO, - be_process_finalize, be_ctx); - if (sige == NULL) { - DEBUG(SSSDBG_CRIT_FAILURE, "tevent_add_signal failed.\n"); - return ENOMEM; - } - - return EOK; -} - static void dp_initialized(struct tevent_req *req); errno_t be_process_init(TALLOC_CTX *mem_ctx, @@ -566,13 +536,6 @@ errno_t be_process_init(TALLOC_CTX *mem_ctx, goto done; } - /* Install signal handler */ - ret = be_process_install_sigterm_handler(be_ctx); - if (ret != EOK) { - DEBUG(SSSDBG_CRIT_FAILURE, "be_install_sigterm_handler failed.\n"); - goto done; - } - req = dp_init_send(be_ctx, be_ctx->ev, be_ctx, be_ctx->uid, be_ctx->gid); if (req == NULL) { ret = ENOMEM;