From 40d8c3d3e81769550bcaf96ec0a3e3308abb8862 Mon Sep 17 00:00:00 2001 From: =?utf8?q?W=C3=A8i=20C=C5=8Dngru=C3=AC?= Date: Wed, 6 Mar 2019 03:23:46 +0000 Subject: [PATCH] internal/poll: fix deadlock in Write if len(buf) > maxRW fd.l.Lock shouldn't be called in a loop. Change-Id: I3afbc184aa06a60175c9a39319985b5810ecb144 Reviewed-on: https://go-review.googlesource.com/c/go/+/165598 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/fd_windows.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index eeef5a78d3..f666b061e2 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -673,6 +673,10 @@ func (fd *FD) Write(buf []byte) (int, error) { return 0, err } defer fd.writeUnlock() + if fd.isFile { + fd.l.Lock() + defer fd.l.Unlock() + } ntotal := 0 for len(buf) > 0 { @@ -683,8 +687,6 @@ func (fd *FD) Write(buf []byte) (int, error) { var n int var err error if fd.isFile { - fd.l.Lock() - defer fd.l.Unlock() switch fd.kind { case kindConsole: n, err = fd.writeConsole(b) -- 2.50.0