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
// 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
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
+}