mirror of
https://github.com/golang/go
synced 2024-11-22 02:04: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
|
||||
// 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
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user