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;