]> Cypherpunks repositories - gostls13.git/commitdiff
src/cmd/go/internal/work: lock Builder output mutex consistently
authormiller <millerresearch@gmail.com>
Sun, 5 Dec 2021 16:39:20 +0000 (16:39 +0000)
committerBryan Mills <bcmills@google.com>
Mon, 6 Dec 2021 19:23:21 +0000 (19:23 +0000)
To prevent interleaving of output when 'go build' compiles several
packages in parallel, the output mutex in the Builder struct must
be locked around any calls to Builder.Print which could generate
arbitrary amounts of text (ie more than is guaranteed to be written
atomically to a pipe).

Fixes #49987
For #49338

Change-Id: I7947df57667deeff3f03f231824298d823f8a943
Reviewed-on: https://go-review.googlesource.com/c/go/+/369018
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Russ Cox <rsc@golang.org>

src/cmd/go/internal/work/buildid.go

index 4e9189a36320ace016890c567fd241ffb92a7a87..76335e9bb170b145d71ff15de5d5383090b2db17 100644 (file)
@@ -570,6 +570,8 @@ func showStdout(b *Builder, c *cache.Cache, actionID cache.ActionID, key string)
                        b.Showcmd("", "%s  # internal", joinUnambiguously(str.StringList("cat", c.OutputFile(stdoutEntry.OutputID))))
                }
                if !cfg.BuildN {
+                       b.output.Lock()
+                       defer b.output.Unlock()
                        b.Print(string(stdout))
                }
        }
@@ -578,6 +580,8 @@ func showStdout(b *Builder, c *cache.Cache, actionID cache.ActionID, key string)
 
 // flushOutput flushes the output being queued in a.
 func (b *Builder) flushOutput(a *Action) {
+       b.output.Lock()
+       defer b.output.Unlock()
        b.Print(string(a.output))
        a.output = nil
 }