diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-06 00:01:29 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-06 00:01:29 +0000 |
commit | dfa75017bea479c829db9f967509caa95411361e (patch) | |
tree | ec92ef61307c6e3ed12bd1ce8c6f47647843c8be /parse.y | |
parent | 9a0802a3bf9ca9af35e22c5609760863b853ae7d (diff) | |
download | ruby-dfa75017bea479c829db9f967509caa95411361e.tar.gz |
parse.y: fix segv after invalid keyword argument
* parse.y (kwd_append): fix segv after invalid keyword argument,
preceding keyword list is NULL when syntax error is there.
[ruby-core:71356] [Bug #11663]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52461 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 34 |
1 files changed, 20 insertions, 14 deletions
@@ -466,6 +466,8 @@ static NODE *new_attr_op_assign_gen(struct parser_params *parser, NODE *lhs, ID static NODE *new_const_op_assign_gen(struct parser_params *parser, NODE *lhs, ID op, NODE *rhs); #define new_const_op_assign(lhs, op, rhs) new_const_op_assign_gen(parser, (lhs), (op), (rhs)) +static NODE *kwd_append(NODE*, NODE*); + static NODE *new_hash_gen(struct parser_params *parser, NODE *hash); #define new_hash(hash) new_hash_gen(parser, (hash)) @@ -4779,13 +4781,7 @@ f_block_kwarg : f_block_kw | f_block_kwarg ',' f_block_kw { /*%%%*/ - NODE *kws = $1; - - while (kws->nd_next) { - kws = kws->nd_next; - } - kws->nd_next = $3; - $$ = $1; + $$ = kwd_append($1, $3); /*% $$ = rb_ary_push($1, $3); %*/ @@ -4804,13 +4800,7 @@ f_kwarg : f_kw | f_kwarg ',' f_kw { /*%%%*/ - NODE *kws = $1; - - while (kws->nd_next) { - kws = kws->nd_next; - } - kws->nd_next = $3; - $$ = $1; + $$ = kwd_append($1, $3); /*% $$ = rb_ary_push($1, $3); %*/ @@ -6805,6 +6795,9 @@ formal_argument_gen(struct parser_params *parser, ID lhs) case ID_CLASS: yyerror("formal argument cannot be a class variable"); return 0; + default: + yyerror("formal argument must be local variable"); + return 0; #else default: lhs = dispatch1(param_error, lhs); @@ -9018,6 +9011,19 @@ gettable_gen(struct parser_params *parser, ID id) compile_error(PARSER_ARG "identifier %"PRIsVALUE" is not valid to get", rb_id2str(id)); return 0; } + +static NODE * +kwd_append(NODE *kwlist, NODE *kw) +{ + if (kwlist) { + NODE *kws = kwlist; + while (kws->nd_next) { + kws = kws->nd_next; + } + kws->nd_next = kw; + } + return kwlist; +} #else /* !RIPPER */ static int id_is_var_gen(struct parser_params *parser, ID id) |