dovecot-2.1: director: Fixed protocol error detection/handling.

dovecot at dovecot.org dovecot at dovecot.org
Fri Apr 20 00:33:17 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/293ada796ae6
changeset: 14443:293ada796ae6
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Apr 20 00:33:13 2012 +0300
description:
director: Fixed protocol error detection/handling.

diffstat:

 src/director/director-connection.c |  30 +++++++++++++-----------------
 1 files changed, 13 insertions(+), 17 deletions(-)

diffs (86 lines):

diff -r ee169584bc44 -r 293ada796ae6 src/director/director-connection.c
--- a/src/director/director-connection.c	Fri Apr 20 00:32:34 2012 +0300
+++ b/src/director/director-connection.c	Fri Apr 20 00:33:13 2012 +0300
@@ -117,7 +117,7 @@
 };
 
 static void director_connection_disconnected(struct director_connection **conn);
-static void director_connection_protocol_error(struct director_connection **conn);
+static void director_connection_reconnect(struct director_connection **conn);
 
 static void ATTR_FORMAT(2, 3)
 director_cmd_error(struct director_connection *conn, const char *fmt, ...)
@@ -128,6 +128,8 @@
 	i_error("director(%s): Command %s: %s (input: %s)", conn->name,
 		conn->cur_cmd, t_strdup_vprintf(fmt, args), conn->cur_line);
 	va_end(args);
+
+	conn->host->last_protocol_failure = ioloop_time;
 }
 
 static void
@@ -1133,10 +1135,8 @@
 		if (ret < 0) {
 			/* invalid commands during handshake,
 			   we probably don't want to reconnect here */
-			if (conn->dir->debug) {
-				i_debug("director(%s): Handshaking failed",
-					conn->host->name);
-			}
+			i_error("director(%s): Handshaking failed",
+				conn->name);
 			return FALSE;
 		}
 		/* allow also other commands during handshake */
@@ -1185,7 +1185,7 @@
 	args = t_strsplit_tab(line);
 	cmd = args[0]; args++;
 	if (cmd == NULL) {
-		i_error("director(%s): Received empty line", conn->name);
+		director_cmd_error(conn, "Received empty line");
 		return FALSE;
 	}
 
@@ -1215,9 +1215,9 @@
 		return;
 	case -2:
 		/* buffer full */
-		i_error("BUG: Director %s sent us more than %d bytes",
-			conn->name, MAX_INBUF_SIZE);
-		director_connection_protocol_error(&conn);
+		director_cmd_error(conn, "Director sent us more than %d bytes",
+				   MAX_INBUF_SIZE);
+		director_connection_reconnect(&conn);
 		return;
 	}
 
@@ -1228,11 +1228,9 @@
 		} T_END;
 
 		if (!ret) {
-			if (dir->debug) {
-				i_debug("director(%s): Invalid input, disconnecting",
-					conn->name);
-			}
-			director_connection_protocol_error(&conn);
+			i_error("director(%s): Invalid input, disconnecting",
+				conn->name);
+			director_connection_reconnect(&conn);
 			break;
 		}
 	}
@@ -1480,13 +1478,11 @@
 		director_connect(dir);
 }
 
-void director_connection_protocol_error(struct director_connection **_conn)
+void director_connection_reconnect(struct director_connection **_conn)
 {
 	struct director_connection *conn = *_conn;
 	struct director *dir = conn->dir;
 
-	conn->host->last_protocol_failure = ioloop_time;
-
 	director_connection_deinit(_conn);
 	if (dir->right == NULL)
 		director_connect(dir);


More information about the dovecot-cvs mailing list