merge revision(s) 52461: [Backport #11663]

* 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/branches/ruby_2_2@52742 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2015-11-24 16:02:52 +00:00
parent e097b9b41b
commit 0ec0eb9c5a
4 changed files with 37 additions and 15 deletions

View file

@ -1,3 +1,9 @@
Wed Nov 25 00:54:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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]
Wed Nov 25 00:47:07 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org> Wed Nov 25 00:47:07 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
* lib/ipaddr.rb, test/test_ipaddr.rb: Reject invalid address contained * lib/ipaddr.rb, test/test_ipaddr.rb: Reject invalid address contained

34
parse.y
View file

@ -456,6 +456,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); 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)) #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); static NODE *new_hash_gen(struct parser_params *parser, NODE *hash);
#define new_hash(hash) new_hash_gen(parser, (hash)) #define new_hash(hash) new_hash_gen(parser, (hash))
@ -4786,13 +4788,7 @@ f_block_kwarg : f_block_kw
| f_block_kwarg ',' f_block_kw | f_block_kwarg ',' f_block_kw
{ {
/*%%%*/ /*%%%*/
NODE *kws = $1; $$ = kwd_append($1, $3);
while (kws->nd_next) {
kws = kws->nd_next;
}
kws->nd_next = $3;
$$ = $1;
/*% /*%
$$ = rb_ary_push($1, $3); $$ = rb_ary_push($1, $3);
%*/ %*/
@ -4811,13 +4807,7 @@ f_kwarg : f_kw
| f_kwarg ',' f_kw | f_kwarg ',' f_kw
{ {
/*%%%*/ /*%%%*/
NODE *kws = $1; $$ = kwd_append($1, $3);
while (kws->nd_next) {
kws = kws->nd_next;
}
kws->nd_next = $3;
$$ = $1;
/*% /*%
$$ = rb_ary_push($1, $3); $$ = rb_ary_push($1, $3);
%*/ %*/
@ -6790,6 +6780,9 @@ formal_argument_gen(struct parser_params *parser, ID lhs)
case ID_CLASS: case ID_CLASS:
yyerror("formal argument cannot be a class variable"); yyerror("formal argument cannot be a class variable");
return 0; return 0;
default:
yyerror("formal argument must be local variable");
return 0;
#else #else
default: default:
lhs = dispatch1(param_error, lhs); lhs = dispatch1(param_error, lhs);
@ -8957,6 +8950,19 @@ gettable_gen(struct parser_params *parser, ID id)
compile_error(PARSER_ARG "identifier %"PRIsVALUE" is not valid to get", rb_id2str(id)); compile_error(PARSER_ARG "identifier %"PRIsVALUE" is not valid to get", rb_id2str(id));
return 0; 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 */ #else /* !RIPPER */
static int static int
id_is_var_gen(struct parser_params *parser, ID id) id_is_var_gen(struct parser_params *parser, ID id)

View file

@ -184,6 +184,16 @@ class TestSyntax < Test::Unit::TestCase
end end
end end
def test_keyword_invalid_name
bug11663 = '[ruby-core:71356] [Bug #11663]'
o = Object.new
assert_syntax_error('def o.foo(arg1?:) end', /arg1\?/, bug11663)
assert_syntax_error('def o.foo(arg1?:, arg2:) end', /arg1\?/, bug11663)
assert_syntax_error('proc {|arg1?:|}', /arg1\?/, bug11663)
assert_syntax_error('proc {|arg1?:, arg2:|}', /arg1\?/, bug11663)
end
def test_optional_self_reference def test_optional_self_reference
bug9593 = '[ruby-core:61299] [Bug #9593]' bug9593 = '[ruby-core:61299] [Bug #9593]'
o = Object.new o = Object.new

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.4" #define RUBY_VERSION "2.2.4"
#define RUBY_RELEASE_DATE "2015-11-25" #define RUBY_RELEASE_DATE "2015-11-25"
#define RUBY_PATCHLEVEL 198 #define RUBY_PATCHLEVEL 199
#define RUBY_RELEASE_YEAR 2015 #define RUBY_RELEASE_YEAR 2015
#define RUBY_RELEASE_MONTH 11 #define RUBY_RELEASE_MONTH 11