]> Cypherpunks repositories - gostls13.git/commitdiff
io: detect Writers that access io.Copy's buffer after returning
authorDamien Neil <dneil@google.com>
Thu, 9 Feb 2023 22:41:42 +0000 (14:41 -0800)
committerGopher Robot <gobot@golang.org>
Fri, 10 Feb 2023 22:09:24 +0000 (22:09 +0000)
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>

src/io/io.go

index 630ab73b56f4f18b091d9284b3b06377a3d36ecd..946ea5b01cac5ac52c81a01f0c85d72a1de51052 100644 (file)
@@ -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 {