From: Timo Sirainen Date: Wed, 9 Feb 2022 08:04:01 +0000 (+0200) Subject: doveadm kick: Run anvil commands in a sub-ioloop X-Git-Tag: 2.4.0~4466 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=974310f86b8a5fdaa816988d9267fc2e29ce3f4d;p=thirdparty%2Fdovecot%2Fcore.git doveadm kick: Run anvil commands in a sub-ioloop Running in main ioloop can cause unexpected IO to happen, which can lead to crashes. --- diff --git a/src/doveadm/doveadm-kick.c b/src/doveadm/doveadm-kick.c index 211d75523e..62c59d0bb0 100644 --- a/src/doveadm/doveadm-kick.c +++ b/src/doveadm/doveadm-kick.c @@ -66,10 +66,12 @@ static void kick_users_via_anvil(struct kick_context *ctx) const struct kick_session *session; string_t *cmd = t_str_new(128); + struct ioloop *ioloop = io_loop_create(); struct anvil_client *anvil = anvil_client_init(ctx->who.anvil_path, NULL, 0); if (anvil_client_connect(anvil, TRUE) < 0) { doveadm_exit_code = EX_TEMPFAIL; + io_loop_destroy(&ioloop); return; } @@ -93,9 +95,10 @@ static void kick_users_via_anvil(struct kick_context *ctx) anvil_client_query(anvil, str_c(cmd), ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, kick_user_anvil_callback, ctx); - io_loop_run(current_ioloop); + io_loop_run(ioloop); } anvil_client_deinit(&anvil); + io_loop_destroy(&ioloop); doveadm_print(dec2str(ctx->kicked_count)); }