diff options
author | Martin Garton <garton@gmail.com> | 2018-11-13 13:34:42 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2018-11-13 15:08:13 +0000 |
commit | e51b19a993efa61b7d8f8d2828d9ee95ea82c98c (patch) | |
tree | 918223af06f3f4cfe9e42a33db4996417f3683d5 /src/bufio | |
parent | 9d025bdafe8390011428b27fe944ee6acc8fa011 (diff) | |
download | go-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.go | 3 | ||||
-rw-r--r-- | src/bufio/bufio_test.go | 18 |
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}) |