diff options
author | Ian Lance Taylor <iant@golang.org> | 2019-04-03 15:30:13 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-04-04 02:24:05 +0000 |
commit | 499088f6dd4cf11e8dfeba23b6d6076144d24390 (patch) | |
tree | cd27693d30166417a1b85cf71807ea0e19a1df3c | |
parent | 991583017c856a14431382794a2a2f98ca52e537 (diff) | |
download | go-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.go | 6 |
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 { |