From 02846d30c0a77293ad481b4f98f6fa6b6b71cb74 Mon Sep 17 00:00:00 2001 From: Victor van den Elzen Date: Tue, 23 Jun 2009 03:47:07 +0200 Subject: [PATCH] BR 2782055: reject invalid tokens after ] A bracketed memory reference should be followed by a comma or the end of the line. Enforce this. --- parser.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/parser.c b/parser.c index 0f640430..450511b6 100644 --- a/parser.c +++ b/parser.c @@ -678,24 +678,32 @@ restart_parse: return result; /* ignore this instruction */ } } + + bool recover = false; if (mref && bracket) { /* find ] at the end */ if (i != ']') { error(ERR_NONFATAL, "parser: expecting ]"); - do { /* error recovery again */ - i = stdscan(NULL, &tokval); - } while (i != 0 && i != ','); - } else /* we got the required ] */ + recover = true; + } else { /* we got the required ] */ i = stdscan(NULL, &tokval); + if (i != 0 && i != ',') { + error(ERR_NONFATAL, "comma or end of line expected"); + recover = true; + } + } } else { /* immediate operand */ if (i != 0 && i != ',' && i != ':') { - error(ERR_NONFATAL, "comma or end of line expected"); - do { /* error recovery */ - i = stdscan(NULL, &tokval); - } while (i != 0 && i != ','); + error(ERR_NONFATAL, "comma, colon or end of line expected"); + recover = true; } else if (i == ':') { result->oprs[operand].type |= COLON; } } + if (recover) { + do { /* error recovery */ + i = stdscan(NULL, &tokval); + } while (i != 0 && i != ','); + } /* now convert the exprs returned from evaluate() into operand * descriptions... */ -- 2.11.4.GIT