From: Dale Weiler Date: Wed, 2 Jan 2013 22:28:26 +0000 (+0000) Subject: Some error checking for computed goto. X-Git-Tag: before-library~382 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=commitdiff_plain;h=c1734d1b27228941bc16a9e23a5966cf4ab81e0a Some error checking for computed goto. --- diff --git a/parser.c b/parser.c index 67c784f..2ed7398 100644 --- a/parser.c +++ b/parser.c @@ -2981,6 +2981,18 @@ static ast_expression *parse_goto_computed(parser_t *parser, ast_expression *sid on_true = parse_goto_computed(parser, ((ast_ternary*)side)->on_true); on_false = parse_goto_computed(parser, ((ast_ternary*)side)->on_false); + if (!on_true) { + parseerror(parser, "expected label or expression in ternary"); + ast_unref(((ast_ternary*)side)->on_false); + return NULL; + } + + if (!on_false) { + parseerror(parser, "expected label or expression in ternary"); + ast_unref(((ast_ternary*)side)->on_true); + return NULL; + } + return (ast_expression*)ast_ifthen_new(parser_ctx(parser), ((ast_ternary*)side)->cond, on_true, on_false); } else if (ast_istype(side, ast_label)) { ast_goto *gt = ast_goto_new(parser_ctx(parser), ((ast_label*)side)->name); @@ -3007,11 +3019,11 @@ static bool parse_goto(parser_t *parser, ast_expression **out) } /* failed to parse expression for goto */ - if (!(expression = parse_expression(parser, false))) - return false; - - if (!(*out = parse_goto_computed(parser, expression))) + if (!(expression = parse_expression(parser, false)) || + !(*out = parse_goto_computed(parser, expression))) { + parseerror(parser, "invalid goto expression"); return false; + } return true; }