Mercurial > dovecot > core-2.2
diff src/director/director-connection.c @ 14479:293ada796ae6
director: Fixed protocol error detection/handling.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 20 Apr 2012 00:33:13 +0300 |
parents | ee169584bc44 |
children | d9f33d78fa3d |
line wrap: on
line diff
--- 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);