src/pkg/bufio/bufio.go | 2 +- src/pkg/bufio/bufio_test.go | 9 +++++++++ diff --git a/src/pkg/bufio/bufio.go b/src/pkg/bufio/bufio.go index 8c951903a1767d76b7c1237ce3357eb9cad66efc..70caf5dae81412e14d5224b9244687d438eb56ca 100644 --- a/src/pkg/bufio/bufio.go +++ b/src/pkg/bufio/bufio.go @@ -226,7 +226,7 @@ // the buffer was not a ReadRune, UnreadRune returns an error. (In this // 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 diff --git a/src/pkg/bufio/bufio_test.go b/src/pkg/bufio/bufio_test.go index fb0ed045aebc4bd6b515ec18cfba26b97baa2c50..fe04b91691e908793dfdcda1a59a3de4e0bddd2e 100644 --- a/src/pkg/bufio/bufio_test.go +++ b/src/pkg/bufio/bufio_test.go @@ -564,3 +564,12 @@ if _, err := buf.Peek(1); err != os.EOF { 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 +}