1
0
mirror of https://github.com/golang/go synced 2024-10-03 06:21:21 -06:00

bufio: bulletproof UnreadRune

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
This commit is contained in:
Rob Pike 2010-10-13 17:12:43 -07:00
parent d6df301774
commit 52e3c99cfb
2 changed files with 10 additions and 1 deletions

View 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

View 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
}