go-imap icon indicating copy to clipboard operation
go-imap copied to clipboard

v1: connection hangs forever in "handleGreetAndStartReading"

Open Simerax opened this issue 4 months ago • 1 comments

Go-Imap 1.2.1 seems to hang forever in some cases even though we set a Timeout (and Deadline) in net.Dialer.

The IMAP-Server we are connecting to (imap.office365.com) seems to just let us "hang" sometimes (I don't know why - it happens randomly).

This would not really be a problem if the client could just hang up on its own after a certain timeout. The settings in net.Dialer don't seem to do anything.

Does the IMAP Library not honor the Timeout/Deadline Setting in net.Dialer here or are we doing something wrong?

We are unable to give you anymore debugging because we cannot call .SetDebug(w) since this problem occurs within DialWithDialerTLS before we even have a handle to the client.

Ps. we are cross compiling from windows/amd64 to linux/amd64 thats probably why the stack trace paths begin with C:\... but the functions are unix/linux like (poll/fd_unix.go)

// ...
tlsConfig := &tls.Config{}

dialer := &net.Dialer{
    Timeout:  time.Second * 10,
    Deadline: time.Now().Add(time.Second * 20),
}

c, err := client.DialWithDialerTLS(dialer, url, tlsConfig)
// ...
goroutine 2943848 [IO wait, 586 minutes]:
internal/poll.runtime_pollWait(0x7f849015d940, 0x72)
	C:/Program Files/Go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc0034ec680?, 0xc000530a00?, 0x0)
	C:/Program Files/Go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	C:/Program Files/Go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0034ec680, {0xc000530a00, 0x1500, 0x1500})
	C:/Program Files/Go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc0034ec680, {0xc000530a00?, 0xc035daf4a0?, 0xc01387e838?})
	C:/Program Files/Go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc007ad00e0, {0xc000530a00?, 0x0?, 0xc01387e880?})
	C:/Program Files/Go/src/net/net.go:179 +0x45
crypto/tls.(*atLeastReader).Read(0xc0005ee858, {0xc000530a00?, 0xc0005ee858?, 0x0?})
	C:/Program Files/Go/src/crypto/tls/conn.go:805 +0x3b
bytes.(*Buffer).ReadFrom(0xc003d349a8, {0x33cdde0, 0xc0005ee858})
	C:/Program Files/Go/src/bytes/buffer.go:211 +0x98
crypto/tls.(*Conn).readFromUntil(0xc003d34700, {0x33cd6c0?, 0xc007ad00e0}, 0x410425?)
	C:/Program Files/Go/src/crypto/tls/conn.go:827 +0xde
crypto/tls.(*Conn).readRecordOrCCS(0xc003d34700, 0x0)
	C:/Program Files/Go/src/crypto/tls/conn.go:625 +0x250
crypto/tls.(*Conn).readRecord(...)
	C:/Program Files/Go/src/crypto/tls/conn.go:587
crypto/tls.(*Conn).Read(0xc003d34700, {0xc00236b000, 0x1000, 0x2?})
	C:/Program Files/Go/src/crypto/tls/conn.go:1369 +0x158
bufio.(*Reader).fill(0xc064da5020)
	C:/Program Files/Go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).ReadRune(0xc064da5020)
	C:/Program Files/Go/src/bufio/bufio.go:307 +0x1e
github.com/emersion/go-imap.(*Reader).ReadAtom(0xc000500900)
	/pkg/mod/github.com/emersion/[email protected]/read.go:186 +0x6c
github.com/emersion/go-imap.ReadResp(0xc000500900)
	/pkg/mod/github.com/emersion/[email protected]/response.go:15 +0x27
github.com/emersion/go-imap/client.(*Client).readOnce(0xc001c203c0)
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:150 +0x3b
github.com/emersion/go-imap/client.(*Client).reader(0xc001c203c0)
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:135 +0x59
created by github.com/emersion/go-imap/client.(*Client).handleGreetAndStartReading in goroutine 2943785
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:517 +0x145


goroutine 2943785 [select, 586 minutes]:
github.com/emersion/go-imap/client.(*Client).execute(0xc001c203c0, {0x33ce420?, 0x42a3c80?}, {0x0?, 0x0})
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:276 +0x48d
github.com/emersion/go-imap/client.(*Client).Capability(0xc001c203c0)
	/pkg/mod/github.com/emersion/[email protected]/client/cmd_any.go:23 +0x2e
github.com/emersion/go-imap/client.(*Client).Support(0xc001c203c0, {0x1807a16, 0x8})
	/pkg/mod/github.com/emersion/[email protected]/client/cmd_any.go:44 +0xc6
github.com/emersion/go-imap/client.New({0x33e0558?, 0xc003d34700})
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:596 +0x2a6
github.com/emersion/go-imap/client.DialWithDialerTLS({0x33c97e0, 0xc00384ca80}, {0xc008127060, 0x19}, 0xc003e7a000)
	/pkg/mod/github.com/emersion/[email protected]/client/client.go:681 +0x22d

Simerax avatar Apr 22 '24 13:04 Simerax