Module: sip-router Branch: andrei/type_conversion Commit: 36d4ed7ce18f025bc69fb24e1820bcb8ec56984f URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=36d4ed7c...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@iptel.org Date: Wed Apr 29 14:02:16 2009 +0200
script parsing: fix bug in expression error checking
- fixed core dump when attempting to continuing script checking after an expression parse error.
---
cfg.y | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/cfg.y b/cfg.y index df3056d..f703238 100644 --- a/cfg.y +++ b/cfg.y @@ -1565,7 +1565,10 @@ send_route_stm: ROUTE_SEND LBRACE actions RBRACE {
exp: rval_expr { - if (!rve_check_type((enum rval_type*)&i_tmp, $1, 0, 0 ,0)){ + if ($1==0){ + yyerror("invalid expression"); + $$=0; + }else if (!rve_check_type((enum rval_type*)&i_tmp, $1, 0, 0 ,0)){ yyerror("invalid expression"); $$=0; }else if (i_tmp!=RV_INT && i_tmp!=RV_NONE){ @@ -2220,9 +2223,9 @@ rval: intno {$$=mk_rve_rval(RV_INT, (void*)$1); } | fcmd {$$=mk_rve_rval(RV_ACTION_ST, $1); } | exp_elem { $$=mk_rve_rval(RV_BEXPR, $1); } | LBRACE actions RBRACE {$$=mk_rve_rval(RV_ACTION_ST, $2); } - | LBRACE error RBRACE { yyerror("bad command block"); } + | LBRACE error RBRACE { $$=0; yyerror("bad command block"); } | LPAREN assign_action RPAREN {$$=mk_rve_rval(RV_ACTION_ST, $2); } - | LPAREN error RPAREN { yyerror("bad expression"); } + | LPAREN error RPAREN { $$=0; yyerror("bad expression"); } ;
@@ -2240,10 +2243,11 @@ rve_op: PLUS { $$=RVE_PLUS_OP; } */
rval_expr: rval { $$=$1; - if ($$==0){ + /* if ($$==0){ yyerror("out of memory\n"); YYABORT; } + */ } | rve_un_op %prec NOT rval_expr {$$=mk_rve1($1, $2); } | rval_expr PLUS rval_expr {$$=mk_rve2(RVE_PLUS_OP, $1, $3); } @@ -2261,7 +2265,7 @@ rval_expr: rval { $$=$1; | STRLEN LPAREN rval_expr RPAREN { $$=mk_rve1(RVE_STRLEN_OP, $3);} | STREMPTY LPAREN rval_expr RPAREN {$$=mk_rve1(RVE_STREMPTY_OP, $3);} | DEFINED rval_expr { $$=mk_rve1(RVE_DEFINED_OP, $2);} - | rve_un_op %prec NOT error { yyerror("bad expression"); } + | rve_un_op %prec NOT error { $$=0; yyerror("bad expression"); } | rval_expr PLUS error { yyerror("bad expression"); } | rval_expr MINUS error { yyerror("bad expression"); } | rval_expr STAR error { yyerror("bad expression"); } @@ -2274,9 +2278,9 @@ rval_expr: rval { $$=$1; { yyerror("bad expression"); } | rval_expr LOG_AND error { yyerror("bad expression"); } | rval_expr LOG_OR error { yyerror("bad expression"); } - | STRLEN LPAREN error RPAREN { yyerror("bad expression"); } - | STREMPTY LPAREN error RPAREN { yyerror("bad expression"); } - | DEFINED error { yyerror("bad expression"); } + | STRLEN LPAREN error RPAREN { $$=0; yyerror("bad expression"); } + | STREMPTY LPAREN error RPAREN { $$=0; yyerror("bad expression"); } + | DEFINED error { $$=0; yyerror("bad expression"); } ;
assign_action: lval assign_op rval_expr { $$=mk_action($2, 2, LVAL_ST, $1, @@ -2904,13 +2908,19 @@ static struct rval_expr* mk_rve2(enum rval_expr_op op, struct rval_expr* rve1, if ((rve1==0) || (rve2==0)) return 0; + bad_rve=0; + bad_t=0; + exp_t=0; cfg_pos_join(&pos, &rve1->fpos, &rve2->fpos); ret=mk_rval_expr2(op, rve1, rve2, &pos); if (ret && (rve_check_type(&type, ret, &bad_rve, &bad_t, &exp_t)!=1)){ - yyerror_at(&pos, "bad expression: type mismatch:" + if (bad_rve) + yyerror_at(&pos, "bad expression: type mismatch:" " %s instead of %s at (%d,%d)", rval_type_name(bad_t), rval_type_name(exp_t), bad_rve->fpos.s_line, bad_rve->fpos.s_col); + else + yyerror("BUG: unexpected null "bad" expression\n"); } return ret; }