From: Alexey Borzenkov Date: Tue, 30 Oct 2012 22:58:05 +0000 (+1100) Subject: net: use read deadline in Accept on windows X-Git-Tag: go1.1rc2~2027 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d12a7d39d1cfa7a0cd824673d7aacc4615b461cb;p=gostls13.git net: use read deadline in Accept on windows Fixes #4296. R=golang-dev, alex.brainman CC=golang-dev https://golang.org/cl/6815044 --- diff --git a/src/pkg/net/fd_windows.go b/src/pkg/net/fd_windows.go index 4ae78397c3..eecb4a866a 100644 --- a/src/pkg/net/fd_windows.go +++ b/src/pkg/net/fd_windows.go @@ -544,7 +544,7 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) { var o acceptOp o.Init(fd, 'r') o.newsock = s - _, err = iosrv.ExecIO(&o, 0) + _, err = iosrv.ExecIO(&o, fd.rdeadline) if err != nil { closesocket(s) return nil, err diff --git a/src/pkg/net/timeout_test.go b/src/pkg/net/timeout_test.go index 672fb7241d..eec371cfb2 100644 --- a/src/pkg/net/timeout_test.go +++ b/src/pkg/net/timeout_test.go @@ -119,3 +119,30 @@ func TestDeadlineReset(t *testing.T) { t.Errorf("unexpected return from Accept; err=%v", err) } } + +func TestTimeoutAccept(t *testing.T) { + switch runtime.GOOS { + case "plan9": + t.Logf("skipping test on %q", runtime.GOOS) + return + } + ln, err := Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + tl := ln.(*TCPListener) + tl.SetDeadline(time.Now().Add(100 * time.Millisecond)) + errc := make(chan error, 1) + go func() { + _, err := ln.Accept() + errc <- err + }() + select { + case <-time.After(1 * time.Second): + // Accept shouldn't block indefinitely + t.Errorf("Accept didn't return in an expected time") + case <-errc: + // Pass. + } +}