Skip to content

Commit 5a52b99

Browse files
Rikkuruemersion
authored andcommitted
imapclient: fix deadlock on error before greeting
1 parent d83e8e9 commit 5a52b99

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

imapclient/client.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -910,8 +910,15 @@ func (c *Client) readResponseData(typ string) error {
910910

911911
// WaitGreeting waits for the server's initial greeting.
912912
func (c *Client) WaitGreeting() error {
913-
<-c.greetingCh
914-
return c.greetingErr
913+
select {
914+
case <-c.greetingCh:
915+
return c.greetingErr
916+
case <-c.decCh:
917+
if c.decErr != nil {
918+
return fmt.Errorf("got error before greeting: %v", c.decErr)
919+
}
920+
return fmt.Errorf("connection closed before greeting")
921+
}
915922
}
916923

917924
// Noop sends a NOOP command.

imapclient/client_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,19 @@ func TestFetch_closeUnreadBody(t *testing.T) {
142142
t.Fatalf("UIDFetch().Close() = %v", err)
143143
}
144144
}
145+
146+
func TestWaitGreeting_eof(t *testing.T) {
147+
// bad server: connected but without greeting
148+
clientConn, serverConn := net.Pipe()
149+
150+
client := imapclient.New(clientConn, nil)
151+
defer client.Close()
152+
153+
if err := serverConn.Close(); err != nil {
154+
t.Fatalf("serverConn.Close() = %v", err)
155+
}
156+
157+
if err := client.WaitGreeting(); err == nil {
158+
t.Fatalf("WaitGreeting() should fail")
159+
}
160+
}

0 commit comments

Comments
 (0)