Mercurial > dovecot > core-2.2
changeset 22731:e821bea31605
doveadm-server: Switch to TCP connection's ioloop while sending logs to remote
Fixes:
Warning: I/O leak: 0x558d7c074ed0 (ostream-file.c:349, fd 16)
Panic: file ioloop.c: line 127 (io_remove_full): assertion failed: (io->callback != NULL)
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Wed, 03 Jan 2018 17:26:38 +0200 |
parents | c7add8c032df |
children | 8a54c4ce0f45 |
files | src/doveadm/client-connection.c src/doveadm/client-connection.h |
diffstat | 2 files changed, 11 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/client-connection.c Mon Oct 30 11:19:17 2017 +0200 +++ b/src/doveadm/client-connection.c Wed Jan 03 17:26:38 2018 +0200 @@ -41,9 +41,14 @@ { if (!log_recursing && doveadm_client != NULL && doveadm_client->log_out != NULL) T_BEGIN { + struct ioloop *prev_ioloop = current_ioloop; /* prevent re-entering this code if any of the following code causes logging */ log_recursing = TRUE; + /* since we can get here from just about anywhere, make sure + the log ostream uses the connection's ioloop. */ + io_loop_set_current(doveadm_client->ioloop); + char c = doveadm_log_type_to_char(ctx->type); const char *ptr,*start; bool corked = o_stream_is_corked(doveadm_client->log_out); @@ -68,6 +73,7 @@ o_stream_uncork(doveadm_client->log_out); if (corked) o_stream_cork(doveadm_client->log_out); + io_loop_set_current(prev_ioloop); log_recursing = FALSE; } T_END; @@ -291,7 +297,7 @@ int argc, const char *const argv[], struct doveadm_cmd_context *cctx) { - struct ioloop *ioloop, *prev_ioloop = current_ioloop; + struct ioloop *prev_ioloop = current_ioloop; const struct doveadm_cmd *cmd = NULL; const struct doveadm_mail_cmd *mail_cmd; struct doveadm_mail_cmd_context *mctx; @@ -318,7 +324,7 @@ /* some commands will want to call io_loop_run(), but we're already running one and we can't call the original one recursively, so create a new ioloop. */ - ioloop = io_loop_create(); + conn->ioloop = io_loop_create(); lib_signals_reset_ioloop(); if (cmd_ver2 != NULL) @@ -333,8 +339,8 @@ o_stream_switch_ioloop(conn->output); if (conn->log_out != NULL) o_stream_switch_ioloop(conn->log_out); - io_loop_set_current(ioloop); - io_loop_destroy(&ioloop); + io_loop_set_current(conn->ioloop); + io_loop_destroy(&conn->ioloop); /* clear all headers */ doveadm_print_deinit();
--- a/src/doveadm/client-connection.h Mon Oct 30 11:19:17 2017 +0200 +++ b/src/doveadm/client-connection.h Wed Jan 03 17:26:38 2018 +0200 @@ -15,6 +15,7 @@ struct ostream *output; struct ostream *log_out; struct ssl_iostream *ssl_iostream; + struct ioloop *ioloop; struct ip_addr local_ip, remote_ip; in_port_t local_port, remote_port; const struct doveadm_settings *set;