aboutsummaryrefslogtreecommitdiff
path: root/src/bufio
diff options
context:
space:
mode:
authorMartin Garton <garton@gmail.com>2018-11-13 13:34:42 +0000
committerIan Lance Taylor <iant@golang.org>2018-11-13 15:08:13 +0000
commite51b19a993efa61b7d8f8d2828d9ee95ea82c98c (patch)
tree918223af06f3f4cfe9e42a33db4996417f3683d5 /src/bufio
parent9d025bdafe8390011428b27fe944ee6acc8fa011 (diff)
downloadgo-e51b19a993efa61b7d8f8d2828d9ee95ea82c98c.tar.gz
go-e51b19a993efa61b7d8f8d2828d9ee95ea82c98c.zip
bufio: make Reader.Peek invalidate Unreads
Since Reader.Peek potentially reads from the underlying io.Reader, discarding previous buffers, UnreadRune and UnreadByte cannot necessarily work. Change Peek to invalidate the unread buffers in all cases (as allowed according to the documentation) and thus prevent hiding bugs in the caller. (This change was previoiusly merged and then reverted due concern about being too close to a release) Fixes #18556 Change-Id: I9027d75aa834d4b27703f37711ba25de04d89f3c GitHub-Last-Rev: 917ef1e51131d734f92efc946a0ab5ca4ff69be6 GitHub-Pull-Request: golang/go#28768 Reviewed-on: https://go-review.googlesource.com/c/149297 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/bufio')
-rw-r--r--src/bufio/bufio.go3
-rw-r--r--src/bufio/bufio_test.go18
2 files changed, 21 insertions, 0 deletions
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go
index 46df619228..ffb278ad9e 100644
--- a/src/bufio/bufio.go
+++ b/src/bufio/bufio.go
@@ -128,6 +128,9 @@ func (b *Reader) Peek(n int) ([]byte, error) {
return nil, ErrNegativeCount
}
+ b.lastByte = -1
+ b.lastRuneSize = -1
+
for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
b.fill() // b.w-b.r < len(b.buf) => buffer is not full
}
diff --git a/src/bufio/bufio_test.go b/src/bufio/bufio_test.go
index 34d70312f7..f7a0682e70 100644
--- a/src/bufio/bufio_test.go
+++ b/src/bufio/bufio_test.go
@@ -285,6 +285,24 @@ func TestUnreadRune(t *testing.T) {
}
}
+func TestNoUnreadRuneAfterPeek(t *testing.T) {
+ br := NewReader(strings.NewReader("example"))
+ br.ReadRune()
+ br.Peek(1)
+ if err := br.UnreadRune(); err == nil {
+ t.Error("UnreadRune didn't fail after Peek")
+ }
+}
+
+func TestNoUnreadByteAfterPeek(t *testing.T) {
+ br := NewReader(strings.NewReader("example"))
+ br.ReadByte()
+ br.Peek(1)
+ if err := br.UnreadByte(); err == nil {
+ t.Error("UnreadByte didn't fail after Peek")
+ }
+}
+
func TestUnreadByte(t *testing.T) {
segments := []string{"Hello, ", "world"}
r := NewReader(&StringReader{data: segments})