From ac7a1a413b9566e0b052248502206eb3d6f8941c Mon Sep 17 00:00:00 2001 From: Thibaut Horel Date: Sun, 21 Feb 2016 21:30:47 -0500 Subject: Fix bug in parser where it could get trapped in infinite loop --- parser.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/parser.go b/parser.go index fae51d6..35999e1 100644 --- a/parser.go +++ b/parser.go @@ -66,10 +66,21 @@ func (p *Parser) Warning(msg string) { log.Printf("%s:%d:%d warning: %s", p.fname, p.lineno, p.colno, msg) } +func (p *Parser) readUnsafe() rune { + ch, _, _ := p.ReadRune() + if ch == '\n' { + p.lineno += 1 + p.colno = 0 + } + p.colno += 1 + p.lastread = ch + return ch +} + func (p *Parser) read() rune { ch, _, err := p.ReadRune() if err == io.EOF { - return eof + panic(err) } if ch == '\n' { p.lineno += 1 @@ -400,9 +411,14 @@ func (p *Parser) readDeclaration() error { } func (p *Parser) Parse(strict bool) error { - var ch rune - for { - ch = p.read() + + defer func() { + if r := recover(); r != nil { + p.Warning("Reached end of file while parsing.") + } + }() + + for ch := p.readUnsafe(); ch != eof; ch = p.readUnsafe() { if ch == '@' { p.eatSpace() err := p.readDeclaration() @@ -418,8 +434,6 @@ func (p *Parser) Parse(strict bool) error { return err } } - } else if ch == eof { - break } } return nil -- cgit v1.2.3-70-g09d2