]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: don't return errors from good Peeks
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 15 Feb 2012 23:15:36 +0000 (10:15 +1100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 15 Feb 2012 23:15:36 +0000 (10:15 +1100)
Fixes #3022

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5674060

src/pkg/bufio/bufio.go
src/pkg/bufio/bufio_test.go

index 156dddfcf071f37d527b929ad33a202a44e4de3f..6f3b1eec9713a200f42517f0d79e34c4e1b13f29 100644 (file)
@@ -106,9 +106,12 @@ func (b *Reader) Peek(n int) ([]byte, error) {
        if m > n {
                m = n
        }
-       err := b.readErr()
-       if m < n && err == nil {
-               err = ErrBufferFull
+       var err error
+       if m < n {
+               err = b.readErr()
+               if err == nil {
+                       err = ErrBufferFull
+               }
        }
        return b.buf[b.r : b.r+m], err
 }
index 9aec61ec426c9a65715f5d7f3943b355be686fd9..a43cbd23a64d0eae2fd5e2c0d2efaf18b80e8800 100644 (file)
@@ -539,6 +539,27 @@ func TestPeek(t *testing.T) {
        if _, err := buf.Peek(1); err != io.EOF {
                t.Fatalf("want EOF got %v", err)
        }
+
+       // Test for issue 3022, not exposing a reader's error on a successful Peek.
+       buf = NewReaderSize(dataAndEOFReader("abcd"), 32)
+       if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
+               t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
+       }
+       if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
+               t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
+       }
+       if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
+               t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
+       }
+       if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
+               t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
+       }
+}
+
+type dataAndEOFReader string
+
+func (r dataAndEOFReader) Read(p []byte) (int, error) {
+       return copy(p, r), io.EOF
 }
 
 func TestPeekThenUnreadRune(t *testing.T) {