# HG changeset patch # User Aki Tuomi # Date 1514993198 -7200 # Node ID e821bea31605c95fe42e47d24edba5092a56ebfe # Parent c7add8c032df8b247ff3a151fcce912c13bd5025 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) diff -r c7add8c032df -r e821bea31605 src/doveadm/client-connection.c --- 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(); diff -r c7add8c032df -r e821bea31605 src/doveadm/client-connection.h --- 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;