aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2023-02-09 14:41:42 -0800
committerGopher Robot <gobot@golang.org>2023-02-10 22:09:24 +0000
commit5c5f8dc94793316ebeab24fc3e6cd6340a95df91 (patch)
treebd93b028b0ac5d83fa1e21e35a2cebb9bd17c24b
parent8491fd311c5d4f38fda026129709306ab4787e87 (diff)
downloadgo-5c5f8dc94793316ebeab24fc3e6cd6340a95df91.tar.xz
io: detect Writers that access io.Copy's buffer after returning
When the race detector is enabled, scribble over copy buffers with garbage after Write returns. For #58452 Change-Id: I25547684bcbef7d302d76736cb02e59c89a640ee Reviewed-on: https://go-review.googlesource.com/c/go/+/466865 Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Damien Neil <dneil@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Damien Neil <dneil@google.com>
-rw-r--r--src/io/io.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/io/io.go b/src/io/io.go
index 630ab73b56..946ea5b01c 100644
--- a/src/io/io.go
+++ b/src/io/io.go
@@ -14,6 +14,7 @@ package io
import (
"errors"
+ "internal/race"
"sync"
)
@@ -427,6 +428,14 @@ func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
nr, er := src.Read(buf)
if nr > 0 {
nw, ew := dst.Write(buf[0:nr])
+ if race.Enabled {
+ // Write over the buffer to help the race detector
+ // detect Write calls that access the buffer after returning.
+ // Use something other than zeros to make errors more obvious.
+ for i := range buf[:nr] {
+ buf[i] = 0xdd
+ }
+ }
if nw < 0 || nr < nw {
nw = 0
if ew == nil {