From 146c4a0eb3311a9fb1a4d61164d84deb3103aee4 Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 17 Nov 2022 22:45:00 +0900 Subject: [PATCH] Fix SEGV when give invalid object to `variables`. --- ext/rbs_extension/parserstate.c | 6 ++++++ test/rbs/parser_test.rb | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ext/rbs_extension/parserstate.c b/ext/rbs_extension/parserstate.c index f260a761e..9add22ba2 100644 --- a/ext/rbs_extension/parserstate.c +++ b/ext/rbs_extension/parserstate.c @@ -299,6 +299,12 @@ parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variab parser_advance(parser); if (!NIL_P(variables)) { + if (!RB_TYPE_P(variables, T_ARRAY)) { + rb_raise(rb_eTypeError, + "wrong argument type %"PRIsVALUE" (must be array or nil)", + rb_obj_class(variables)); + } + parser_push_typevar_table(parser, true); for (long i = 0; i < rb_array_len(variables); i++) { diff --git a/test/rbs/parser_test.rb b/test/rbs/parser_test.rb index 94750a9a2..346e5ab0e 100644 --- a/test/rbs/parser_test.rb +++ b/test/rbs/parser_test.rb @@ -58,13 +58,19 @@ def test_interface_mixin end end - def test_type_error + def test_type_error_for_content buffer = RBS::Buffer.new(content: 1, name: nil) assert_raises TypeError do RBS::Parser.parse_signature(buffer) end end + def test_type_error_for_variables + assert_raises TypeError do + RBS::Parser.parse_type("bool", variables: 1) + end + end + def test_interface_alias RBS::Parser.parse_signature(buffer(<<-RBS)).tap do |decls| interface _Foo[unchecked in A]