From cac1e161aca1dbc56d89fe18b9eed8171e8c8a69 Mon Sep 17 00:00:00 2001 From: Alberto Bertogli Date: Sun, 31 Mar 2019 12:13:09 +0100 Subject: [PATCH] smtpsrv: Set connection deadline before the initial greeting When handling a connection, today we only set a deadline after each command received. However, this does not cover our initial greeting, or the initial TLS handshake (if the socket is TLS), so a connection can hang indefininitely at that stage. This patch fixes that by setting a deadline earlier, before we send or receive anythong on the connection. --- internal/smtpsrv/conn.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/smtpsrv/conn.go b/internal/smtpsrv/conn.go index 479fb59..d3fe30a 100644 --- a/internal/smtpsrv/conn.go +++ b/internal/smtpsrv/conn.go @@ -163,6 +163,10 @@ func (c *Conn) Handle() { defer c.tr.Finish() c.tr.Debugf("Connected, mode: %s", c.mode) + // Set the first deadline, which covers possibly the TLS handshake and + // then our initial greeting. + c.conn.SetDeadline(time.Now().Add(c.commandTimeout)) + if tc, ok := c.conn.(*tls.Conn); ok { // For TLS connections, complete the handshake and get the state, so // it can be used when we say hello below.