From 18f89991efbeea490621a2a961d3b926f6592e8f Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 22 Aug 2024 18:28:56 +0800 Subject: [PATCH] parser: check too many layers embedded generic type (fix #22089) (#22091) --- vlib/v/parser/parse_type.v | 9 + vlib/v/parser/parser.v | 1 + ..._too_many_nested_generic_types_vfmt_off.vv | 441 ++++++++++++++++++ ..._many_layers_embedded_generic_type_err.out | 7 + ...o_many_layers_embedded_generic_type_err.vv | 95 ++++ 5 files changed, 553 insertions(+) create mode 100644 vlib/v/parser/testdata/silent/radamsa_too_many_nested_generic_types_vfmt_off.vv create mode 100644 vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.out create mode 100644 vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.vv diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index a333c62e2b..87cccefa0c 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -9,6 +9,7 @@ import v.util import v.token const maximum_inline_sum_type_variants = 3 +const generic_type_level_cutoff_limit = 10 // it is very rarely deeper than 4 fn (mut p Parser) parse_array_type(expecting token.Kind, is_option bool) ast.Type { p.check(expecting) @@ -866,6 +867,14 @@ fn (mut p Parser) parse_generic_type(name string) ast.Type { } fn (mut p Parser) parse_generic_inst_type(name string) ast.Type { + p.generic_type_level++ + defer { + p.generic_type_level-- + } + if p.generic_type_level > parser.generic_type_level_cutoff_limit { + p.error('too many levels of Parser.parse_generic_inst_type() calls: ${p.generic_type_level}, probably due to too many layers embedded generic type') + return ast.void_type + } mut bs_name := name mut bs_cname := name start_pos := p.tok.pos() diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index bceafc9a61..fe69dc1c10 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -105,6 +105,7 @@ mut: left_comments []ast.Comment script_mode bool script_mode_start_token token.Token + generic_type_level int // to avoid infinite recursion segfaults due to compiler bugs in ensure_type_exists pub mut: scanner &scanner.Scanner = unsafe { nil } table &ast.Table = unsafe { nil } diff --git a/vlib/v/parser/testdata/silent/radamsa_too_many_nested_generic_types_vfmt_off.vv b/vlib/v/parser/testdata/silent/radamsa_too_many_nested_generic_types_vfmt_off.vv new file mode 100644 index 0000000000..fc10d824b4 --- /dev/null +++ b/vlib/v/parser/testdata/silent/radamsa_too_many_nested_generic_types_vfmt_off.vv @@ -0,0 +1,441 @@ +println('Hello, Worllo, Worintln('Hello, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, World!')< +o, Wprld< +o, WprldWorld!')< +o, Wprld< +o, Wprld< +orld!')< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< diff --git a/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.out b/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.out new file mode 100644 index 0000000000..403b384d35 --- /dev/null +++ b/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.vv:11:9: error: too many levels of Parser.parse_generic_inst_type() calls: 11, probably due to too many layers embedded generic type + 9 | o, Wprld< + 10 | o, Wprld< + 11 | o, Wprld< + | ^ + 12 | o, Wprld< + 13 | o, Wprld< diff --git a/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.vv b/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.vv new file mode 100644 index 0000000000..d6b530b959 --- /dev/null +++ b/vlib/v/parser/tests/too_many_layers_embedded_generic_type_err.vv @@ -0,0 +1,95 @@ +Hello, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld< +o, Wprld<