dovecot-2.2: replicator: Send only one sync command to doveadm-s...

dovecot at dovecot.org dovecot at dovecot.org
Tue Jan 8 07:43:40 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/e0d4d8f9d097
changeset: 15593:e0d4d8f9d097
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jan 08 07:42:38 2013 +0200
description:
replicator: Send only one sync command to doveadm-server per connection.
This fixes setuid()/setgid() problems when multiple UIDs are used.

diffstat:

 src/replication/replicator/doveadm-connection.c |  21 ++++++++++++++++-----
 1 files changed, 16 insertions(+), 5 deletions(-)

diffs (80 lines):

diff -r 0949ddc3a892 -r e0d4d8f9d097 src/replication/replicator/doveadm-connection.c
--- a/src/replication/replicator/doveadm-connection.c	Tue Jan 08 06:41:56 2013 +0200
+++ b/src/replication/replicator/doveadm-connection.c	Tue Jan 08 07:42:38 2013 +0200
@@ -29,6 +29,7 @@
 	time_t last_connect_failure;
 	unsigned int handshaked:1;
 	unsigned int end_of_print:1;
+	unsigned int cmd_sent:1;
 };
 
 struct doveadm_connection *doveadm_connection_init(const char *path)
@@ -55,7 +56,7 @@
 	callback(reply, context);
 }
 
-static void doveadm_disconnect(struct doveadm_connection *conn)
+static void doveadm_close(struct doveadm_connection *conn)
 {
 	if (conn->fd == -1)
 		return;
@@ -66,7 +67,13 @@
 	if (close(conn->fd) < 0)
 		i_error("close(doveadm) failed: %m");
 	conn->fd = -1;
+	conn->end_of_print = FALSE;
+	conn->cmd_sent = FALSE;
+}
 
+static void doveadm_disconnect(struct doveadm_connection *conn)
+{
+	doveadm_close(conn);
 	if (conn->callback != NULL)
 		doveadm_callback(conn, DOVEADM_REPLY_FAIL);
 }
@@ -102,6 +109,9 @@
 			conn->end_of_print = TRUE;
 		return 0;
 	}
+	line = t_strdup(line);
+	doveadm_close(conn);
+
 	if (line[0] == '+')
 		doveadm_callback(conn, DOVEADM_REPLY_OK);
 	else if (line[0] == '-') {
@@ -113,9 +123,9 @@
 		i_error("%s: Invalid input: %s", conn->path, line);
 		return -1;
 	}
-	conn->end_of_print = FALSE;
 	/* FIXME: disconnect after each request for now.
-	   doveadm server's getopt() handling seems to break otherwise */
+	   doveadm server's getopt() handling seems to break otherwise.
+	   also with multiple UIDs doveadm-server fails because setid() fails */
 	return -1;
 }
 
@@ -158,7 +168,7 @@
 
 static void doveadm_fail_timeout(struct doveadm_connection *conn)
 {
-	doveadm_callback(conn, DOVEADM_REPLY_FAIL);
+	doveadm_disconnect(conn);
 }
 
 void doveadm_connection_sync(struct doveadm_connection *conn,
@@ -170,6 +180,7 @@
 	i_assert(callback != NULL);
 	i_assert(!doveadm_connection_is_busy(conn));
 
+	conn->cmd_sent = TRUE;
 	conn->callback = callback;
 	conn->context = context;
 
@@ -192,5 +203,5 @@
 
 bool doveadm_connection_is_busy(struct doveadm_connection *conn)
 {
-	return conn->callback != NULL;
+	return conn->cmd_sent;
 }


More information about the dovecot-cvs mailing list