Skip to content

Commit

Permalink
Set proper deadline timeouts
Browse files Browse the repository at this point in the history
  • Loading branch information
kayrus committed Aug 31, 2022
1 parent 358ef5a commit 88735a2
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
18 changes: 12 additions & 6 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,10 @@ func (c *Client) InitConn(conn net.Conn) error {
c.setConn(conn)

// Set initial greeting timeout.
c.conn.SetDeadline(time.Now().Add(c.CommandTimeout))
defer c.conn.SetDeadline(time.Time{})
if t := c.CommandTimeout; t > 0 {
c.conn.SetDeadline(time.Now().Add(t))
defer c.conn.SetDeadline(time.Time{})
}

_, _, err := c.Text.ReadResponse(220)
if err != nil {
Expand Down Expand Up @@ -205,8 +207,10 @@ func (c *Client) Hello(localName string) error {
// cmd is a convenience function that sends a command and returns the response
// textproto.Error returned by c.Text.ReadResponse is converted into SMTPError.
func (c *Client) cmd(expectCode int, format string, args ...interface{}) (int, string, error) {
c.conn.SetDeadline(time.Now().Add(c.CommandTimeout))
defer c.conn.SetDeadline(time.Time{})
if t := c.CommandTimeout; t > 0 {
c.conn.SetDeadline(time.Now().Add(t))
defer c.conn.SetDeadline(time.Time{})
}

id, err := c.Text.Cmd(format, args...)
if err != nil {
Expand Down Expand Up @@ -444,8 +448,10 @@ type dataCloser struct {
func (d *dataCloser) Close() error {
d.WriteCloser.Close()

d.c.conn.SetDeadline(time.Now().Add(d.c.SubmissionTimeout))
defer d.c.conn.SetDeadline(time.Time{})
if t := d.c.SubmissionTimeout; t > 0 {
d.c.conn.SetDeadline(time.Now().Add(t))
defer d.c.conn.SetDeadline(time.Time{})
}

if !d.c.lmtp {
code, msg, err := d.c.Text.ReadResponse(250)
Expand Down
15 changes: 10 additions & 5 deletions conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,12 @@ func (c *Conn) handleStartTLS() {

// Upgrade to TLS
tlsConn := tls.Server(c.conn, c.server.TLSConfig)

if t := c.server.ReadTimeout; t != 0 {
tlsConn.SetReadDeadline(time.Now().Add(t))
}
if t := c.server.WriteTimeout; t != 0 {
tlsConn.SetWriteDeadline(time.Now().Add(t))
}
if err := tlsConn.Handshake(); err != nil {
if err == io.EOF {
return
Expand Down Expand Up @@ -983,8 +988,8 @@ func (c *Conn) greet() {

func (c *Conn) WriteResponse(code int, enhCode EnhancedCode, text ...string) {
// TODO: error handling
if c.server.WriteTimeout != 0 {
c.conn.SetWriteDeadline(time.Now().Add(c.server.WriteTimeout))
if t := c.server.WriteTimeout; t != 0 {
c.conn.SetWriteDeadline(time.Now().Add(t))
}

// All responses must include an enhanced code, if it is missing - use
Expand All @@ -1011,8 +1016,8 @@ func (c *Conn) WriteResponse(code int, enhCode EnhancedCode, text ...string) {

// Reads a line of input
func (c *Conn) ReadLine() (string, error) {
if c.server.ReadTimeout != 0 {
if err := c.conn.SetReadDeadline(time.Now().Add(c.server.ReadTimeout)); err != nil {
if t := c.server.ReadTimeout; t != 0 {
if err := c.conn.SetReadDeadline(time.Now().Add(t)); err != nil {
return "", err
}
}
Expand Down

0 comments on commit 88735a2

Please sign in to comment.