diff options
author | Patrick McHardy <kaber@trash.net> | 2014-02-04 11:22:31 +0000 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2014-02-04 11:26:25 +0000 |
commit | 852cefe60391a16c5fa238f3ab3044dad239c508 (patch) | |
tree | 90b9939c14df1a6f4dde6d55506a5e75414bb1ee /src/parser.y | |
parent | 47e7132763633d88307ed5fadaf5f2b11d5490c6 (diff) |
parser: prohibit redefinitions of symbols and verify existance on use
This patch fixes some incorrect behaviour of symbolic variables:
- prohibit redefining an existing symbol
- verify existance of a symbolic variable during parsing instead of evaluation
The second point makes sure we don't allow recursive definitions (var = $var),
which lead to a crash due to stack exhaustion.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/parser.y')
-rw-r--r-- | src/parser.y | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/parser.y b/src/parser.y index cc0aed69..f6c9488a 100644 --- a/src/parser.y +++ b/src/parser.y @@ -520,7 +520,15 @@ common_block : INCLUDE QUOTED_STRING stmt_seperator } | DEFINE identifier '=' initializer_expr stmt_seperator { - symbol_bind(current_scope(state), $2, $4); + struct scope *scope = current_scope(state); + + if (symbol_lookup(scope, $2) != NULL) { + erec_queue(error(&@2, "redfinition of symbol '%s'", $2), + state->msgs); + YYERROR; + } + + symbol_bind(scope, $2, $4); xfree($2); } | error stmt_seperator @@ -1228,9 +1236,16 @@ symbol_expr : string } | '$' identifier { + struct scope *scope = current_scope(state); + + if (symbol_lookup(scope, $2) == NULL) { + erec_queue(error(&@2, "unknown identifier '%s'", $2), + state->msgs); + YYERROR; + } + $$ = symbol_expr_alloc(&@$, SYMBOL_DEFINE, - current_scope(state), - $2); + scope, $2); xfree($2); } | AT identifier |