aboutsummaryrefslogtreecommitdiff
path: root/src/io
diff options
context:
space:
mode:
authorTao Qingyun <qingyunha@gmail.com>2020-10-13 05:56:48 +0000
committerRobert Griesemer <gri@golang.org>2020-10-13 17:36:36 +0000
commitad53103aef09c002c41ea34292cfea359857ae5b (patch)
tree3d7a2cdd351f8bc6e4eef85c3d308ead6f551c20 /src/io
parent58e51b1e620167cc22ca7143c395cb63db5640a8 (diff)
downloadgo-ad53103aef09c002c41ea34292cfea359857ae5b.tar.gz
go-ad53103aef09c002c41ea34292cfea359857ae5b.zip
io: add ErrBadWriteCount
Fixes #39978 Change-Id: Ib41459861ba9f7cf0bf1fc95b1479c358c4bdbd8 GitHub-Last-Rev: 19cbb1461ca04a8eb64f0c4f354d8fb81a70d4f3 GitHub-Pull-Request: golang/go#39989 Reviewed-on: https://go-review.googlesource.com/c/go/+/240740 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Trust: Ian Lance Taylor <iant@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/io')
-rw-r--r--src/io/io.go11
-rw-r--r--src/io/io_test.go28
2 files changed, 37 insertions, 2 deletions
diff --git a/src/io/io.go b/src/io/io.go
index adc0c0d550..87ebe8c147 100644
--- a/src/io/io.go
+++ b/src/io/io.go
@@ -30,6 +30,9 @@ var ErrShortWrite = errors.New("short write")
// ErrShortBuffer means that a read required a longer buffer than was provided.
var ErrShortBuffer = errors.New("short buffer")
+// ErrBadWriteCount means that a write returned an impossible count.
+var ErrBadWriteCount = errors.New("Write returned impossible count")
+
// EOF is the error returned by Read when no more input is available.
// (Read must return EOF itself, not an error wrapping EOF,
// because callers will test for EOF using ==.)
@@ -411,9 +414,13 @@ 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 nw > 0 {
- written += int64(nw)
+ if nw < 0 || nr < nw {
+ nw = 0
+ if ew == nil {
+ ew = ErrBadWriteCount
+ }
}
+ written += int64(nw)
if ew != nil {
err = ew
break
diff --git a/src/io/io_test.go b/src/io/io_test.go
index 170513dcc0..a8399bcac6 100644
--- a/src/io/io_test.go
+++ b/src/io/io_test.go
@@ -429,3 +429,31 @@ func TestSectionReader_Size(t *testing.T) {
}
}
}
+
+// largeWriter returns an invalid count that is larger than the number
+// of bytes provided (issue 39978).
+type largeWriter struct {
+ err error
+}
+
+func (w largeWriter) Write(p []byte) (int, error) {
+ return len(p) + 1, w.err
+}
+
+func TestCopyLargeWriter(t *testing.T) {
+ want := ErrBadWriteCount
+ rb := new(Buffer)
+ wb := largeWriter{}
+ rb.WriteString("hello, world.")
+ if _, err := Copy(wb, rb); err != want {
+ t.Errorf("Copy error: got %v, want %v", err, want)
+ }
+
+ want = errors.New("largeWriterError")
+ rb = new(Buffer)
+ wb = largeWriter{err: want}
+ rb.WriteString("hello, world.")
+ if _, err := Copy(wb, rb); err != want {
+ t.Errorf("Copy error: got %v, want %v", err, want)
+ }
+}