]> Cypherpunks.ru repositories - gostls13.git/commitdiff
bufio: make Reader.Peek invalidate Unreads
authorMartin Garton <garton@gmail.com>
Tue, 13 Nov 2018 13:34:42 +0000 (13:34 +0000)
committerIan Lance Taylor <iant@golang.org>
Tue, 13 Nov 2018 15:08:13 +0000 (15:08 +0000)
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>
src/bufio/bufio.go
src/bufio/bufio_test.go

index 46df6192280b8e61dac8e5e00be95ed2552779fb..ffb278ad9e2d0067615402eb111d9c4876950896 100644 (file)
@@ -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
        }
index 34d70312f7bc0e6cb76a281efab2f3fb5fa6e912..f7a0682e7033dd2f4c6b6664b98fd7d1df9fea06 100644 (file)
@@ -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})