]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: bulletproof UnreadRune
authorRob Pike <r@golang.org>
Thu, 14 Oct 2010 00:12:43 +0000 (17:12 -0700)
committerRob Pike <r@golang.org>
Thu, 14 Oct 2010 00:12:43 +0000 (17:12 -0700)
After a fill(), there is nothing to back up.  Make sure UnreadRune
recognizes the situation.

Fixes #1137.
(Stops the crash, but doesn't make UnreadRune usable after a Peek()).

R=rsc
CC=golang-dev
https://golang.org/cl/2498041

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

index 8c951903a1767d76b7c1237ce3357eb9cad66efc..70caf5dae81412e14d5224b9244687d438eb56ca 100644 (file)
@@ -226,7 +226,7 @@ func (b *Reader) ReadRune() (rune int, size int, err os.Error) {
 // regard it is stricter than UnreadByte, which will unread the last byte
 // from any read operation.)
 func (b *Reader) UnreadRune() os.Error {
-       if b.lastRuneSize < 0 {
+       if b.lastRuneSize < 0 || b.r == 0 {
                return ErrInvalidUnreadRune
        }
        b.r -= b.lastRuneSize
index fb0ed045aebc4bd6b515ec18cfba26b97baa2c50..fe04b91691e908793dfdcda1a59a3de4e0bddd2e 100644 (file)
@@ -564,3 +564,12 @@ func TestPeek(t *testing.T) {
                t.Fatalf("want EOF got %v", err)
        }
 }
+
+func TestPeekThenUnreadRune(t *testing.T) {
+       // This sequence used to cause a crash.
+       r := NewReader(strings.NewReader("x"))
+       r.ReadRune()
+       r.Peek(1)
+       r.UnreadRune()
+       r.ReadRune() // Used to panic here
+}