mirror of
https://github.com/golang/go
synced 2024-11-22 02:14:40 -07: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:
parent
d6df301774
commit
52e3c99cfb
@ -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
|
// regard it is stricter than UnreadByte, which will unread the last byte
|
||||||
// from any read operation.)
|
// from any read operation.)
|
||||||
func (b *Reader) UnreadRune() os.Error {
|
func (b *Reader) UnreadRune() os.Error {
|
||||||
if b.lastRuneSize < 0 {
|
if b.lastRuneSize < 0 || b.r == 0 {
|
||||||
return ErrInvalidUnreadRune
|
return ErrInvalidUnreadRune
|
||||||
}
|
}
|
||||||
b.r -= b.lastRuneSize
|
b.r -= b.lastRuneSize
|
||||||
|
@ -564,3 +564,12 @@ func TestPeek(t *testing.T) {
|
|||||||
t.Fatalf("want EOF got %v", err)
|
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
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user