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 4ae7839..eecb4a8 100644
--- a/src/pkg/net/fd_windows.go
+++ b/src/pkg/net/fd_windows.go
@@ -544,7 +544,7 @@
 	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 672fb72..eec371c 100644
--- a/src/pkg/net/timeout_test.go
+++ b/src/pkg/net/timeout_test.go
@@ -119,3 +119,30 @@
 		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.
+	}
+}