]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: make Reader.Peek invalidate Unreads
authorMartin Garton <garton@gmail.com>
Tue, 27 Jun 2017 17:02:23 +0000 (18:02 +0100)
committerRobert Griesemer <gri@golang.org>
Tue, 27 Jun 2017 19:51:54 +0000 (19:51 +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.

Fixes #18556

Change-Id: I8d836db7ce31c4aaecb4f61c24573b0332bbf30d
Reviewed-on: https://go-review.googlesource.com/46850
Reviewed-by: Robert Griesemer <gri@golang.org>
src/bufio/bufio.go
src/bufio/bufio_test.go

index da94a2503f0a8fdb4caf7ba446511589881a41b0..f1a270336fc1c693dc53e35bfb52fac7b5aecf0d 100644 (file)
@@ -125,6 +125,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 ef0f6c834e86230f9f7d63c3dfd407022afdb8a7..50f571c04f0e5d8ba431f87ffef2edf483621a26 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})