dovecot-2.0-sslstream: lmtp proxy: Added data input timeout.

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:56:11 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/2ad1ad1e1083
changeset: 10285:2ad1ad1e1083
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Nov 09 19:07:15 2009 -0500
description:
lmtp proxy: Added data input timeout.

diffstat:

1 file changed, 20 insertions(+), 3 deletions(-)
src/lmtp/lmtp-proxy.c |   23 ++++++++++++++++++++---

diffs (82 lines):

diff -r cb7b2901f1f8 -r 2ad1ad1e1083 src/lmtp/lmtp-proxy.c
--- a/src/lmtp/lmtp-proxy.c	Mon Nov 09 18:54:40 2009 -0500
+++ b/src/lmtp/lmtp-proxy.c	Mon Nov 09 19:07:15 2009 -0500
@@ -10,6 +10,7 @@
 #include "lmtp-proxy.h"
 
 #define LMTP_MAX_LINE_LEN 1024
+#define LMTP_PROXY_DATA_INPUT_TIMEOUT_MSECS (1000*60)
 
 struct lmtp_proxy_recipient {
 	struct lmtp_proxy_connection *conn;
@@ -40,7 +41,7 @@ struct lmtp_proxy {
 	ARRAY_DEFINE(rcpt_to, struct lmtp_proxy_recipient);
 	unsigned int rcpt_next_reply_idx;
 
-	struct timeout *to;
+	struct timeout *to, *to_data_idle;
 	struct io *io;
 	struct istream *data_input;
 	struct ostream *client_output;
@@ -97,6 +98,8 @@ void lmtp_proxy_deinit(struct lmtp_proxy
 		i_stream_unref(&proxy->data_input);
 	if (proxy->client_output != NULL)
 		o_stream_unref(&proxy->client_output);
+	if (proxy->to_data_idle != NULL)
+		timeout_remove(&proxy->to_data_idle);
 	if (proxy->to != NULL)
 		timeout_remove(&proxy->to);
 	if (proxy->io != NULL)
@@ -194,7 +197,7 @@ static void lmtp_proxy_try_finish(struct
 		lmtp_proxy_finish(proxy);
 }
 
-static void lmtp_proxy_data_disconnected(struct lmtp_proxy *proxy)
+static void lmtp_proxy_fail_all(struct lmtp_proxy *proxy, const char *line)
 {
 	struct lmtp_proxy_recipient *rcpt;
 	unsigned int i, count;
@@ -204,7 +207,7 @@ static void lmtp_proxy_data_disconnected
 	for (i = proxy->rcpt_next_reply_idx; i < count; i++) {
 		if (!rcpt[i].rcpt_to_failed) {
 			i_assert(!rcpt[i].data_reply_received);
-			rcpt[i].reply = "451 4.4.0 Client disconnected in DATA";
+			rcpt[i].reply = line;
 			rcpt[i].data_reply_received = TRUE;
 		}
 	}
@@ -212,6 +215,16 @@ static void lmtp_proxy_data_disconnected
 	i_assert(ret);
 
 	lmtp_proxy_finish(proxy);
+}
+
+static void lmtp_proxy_data_input_timeout(struct lmtp_proxy *proxy)
+{
+	lmtp_proxy_fail_all(proxy, "451 4.4.2 Input timeout in DATA");
+}
+
+static void lmtp_proxy_data_disconnected(struct lmtp_proxy *proxy)
+{
+	lmtp_proxy_fail_all(proxy, "451 4.4.2 Client disconnected in DATA");
 }
 
 static void
@@ -318,6 +331,8 @@ static bool lmtp_proxy_data_read(struct 
 static bool lmtp_proxy_data_read(struct lmtp_proxy *proxy)
 {
 	size_t size;
+
+	timeout_reset(proxy->to_data_idle);
 
 	switch (i_stream_read(proxy->data_input)) {
 	case -2:
@@ -371,6 +386,8 @@ void lmtp_proxy_start(struct lmtp_proxy 
 	proxy->finish_context = context;
 	proxy->tee_data_input = tee_i_stream_create(data_input);
 	proxy->data_input = tee_i_stream_create_child(proxy->tee_data_input);
+	proxy->to_data_idle = timeout_add(LMTP_PROXY_DATA_INPUT_TIMEOUT_MSECS,
+					  lmtp_proxy_data_input_timeout, proxy);
 
 	conns = array_get(&proxy->connections, &count);
 	for (i = 0; i < count; i++) {


More information about the dovecot-cvs mailing list