parser: check too many layers embedded generic type (fix #22089) (#22091)

This commit is contained in:
yuyi 2024-08-22 18:28:56 +08:00 committed by GitHub
parent 423a94aa58
commit 18f89991ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 553 additions and 0 deletions

View File

@ -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()

View File

@ -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 }

View File

@ -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<

View File

@ -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<

View File

@ -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<