Skip to content

Commit 97ec0a8

Browse files
dspeziaadg
authored andcommitted
[release-branch.go1.5] cmd/asm: fix potential infinite loop in parser
For ARM machines, the assembler supports list of registers operands such as [R1,R2]. A list missing a ']' results in the parser issuing many errors and consuming all the tokens. At EOF (i.e. end of the line), it still loops. Normally, a counter is maintained to make sure the parser stops after 10 errors. However, multiple errors occuring on the same line are simply ignored. Only the first one is reported. At most one error per line is accounted. Missing ']' in a register list therefore results in an infinite loop. Fixed the parser by explicitly checking for ']' to interrupt this loops In the operand tests, also fixed a wrong entry which I think was not set on purpose (but still led to a successful result). Fixes #11764 Change-Id: Ie87773388ee0d21b3a2a4cb941d4d911d0230ba4 Reviewed-on: https://go-review.googlesource.com/13920 Reviewed-by: Rob Pike <[email protected]> Reviewed-on: https://go-review.googlesource.com/14225
1 parent 2dfb0eb commit 97ec0a8

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/cmd/asm/internal/asm/operand_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ var amd64OperandTests = []operandTest{
181181
{"x·y+8(SB)", "x.y+8(SB)"},
182182
{"x·y+8(SP)", "x.y+8(SP)"},
183183
{"y+56(FP)", "y+56(FP)"},
184-
{"·AddUint32(SB", "\"\".AddUint32(SB)"},
184+
{"·AddUint32(SB)", "\"\".AddUint32(SB)"},
185185
{"·callReflect(SB)", "\"\".callReflect(SB)"},
186186
}
187187

@@ -288,6 +288,7 @@ var armOperandTests = []operandTest{
288288
{"runtime·_sfloat2(SB)", "runtime._sfloat2(SB)"},
289289
{"·AddUint32(SB)", "\"\".AddUint32(SB)"},
290290
{"(R1, R3)", "(R1, R3)"},
291+
{"[R0,R1,g,R15", ""}, // Issue 11764 - previously asm just hung parsing ']' missing register lists
291292
}
292293

293294
var ppc64OperandTests = []operandTest{

src/cmd/asm/internal/asm/parse.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,10 +698,15 @@ func (p *Parser) registerIndirect(a *obj.Addr, prefix rune) {
698698
func (p *Parser) registerList(a *obj.Addr) {
699699
// One range per loop.
700700
var bits uint16
701+
ListLoop:
701702
for {
702703
tok := p.next()
703-
if tok.ScanToken == ']' {
704-
break
704+
switch tok.ScanToken {
705+
case ']':
706+
break ListLoop
707+
case scanner.EOF:
708+
p.errorf("missing ']' in register list")
709+
return
705710
}
706711
lo := p.registerNumber(tok.String())
707712
hi := lo

0 commit comments

Comments
 (0)