aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-04-03 15:30:13 -0700
committerIan Lance Taylor <iant@golang.org>2019-04-04 02:24:05 +0000
commit499088f6dd4cf11e8dfeba23b6d6076144d24390 (patch)
treecd27693d30166417a1b85cf71807ea0e19a1df3c
parent991583017c856a14431382794a2a2f98ca52e537 (diff)
downloadgo-499088f6dd4cf11e8dfeba23b6d6076144d24390.tar.gz
go-499088f6dd4cf11e8dfeba23b6d6076144d24390.zip
[release-branch.go1.12] internal/poll: fix deadlock in Write if len(buf) > maxRW
fd.l.Lock shouldn't be called in a loop. Manual backport of CL 165598. It could not be cherry-picked due to conflicts. Fixes #31211 Change-Id: Ib76e679f6a276b32fe9c1594b7e9a506017a7967 Reviewed-on: https://go-review.googlesource.com/c/go/+/170680 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-rw-r--r--src/internal/poll/fd_windows.go6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go
index 19d9a12dad..f860b82c97 100644
--- a/src/internal/poll/fd_windows.go
+++ b/src/internal/poll/fd_windows.go
@@ -660,6 +660,10 @@ func (fd *FD) Write(buf []byte) (int, error) {
return 0, err
}
defer fd.writeUnlock()
+ if fd.isFile || fd.isDir || fd.isConsole {
+ fd.l.Lock()
+ defer fd.l.Unlock()
+ }
ntotal := 0
for len(buf) > 0 {
@@ -670,8 +674,6 @@ func (fd *FD) Write(buf []byte) (int, error) {
var n int
var err error
if fd.isFile || fd.isDir || fd.isConsole {
- fd.l.Lock()
- defer fd.l.Unlock()
if fd.isConsole {
n, err = fd.writeConsole(b)
} else {