1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: protect against unlimited recursion in Checker.ensure_generic_type_specify_type_names

This commit is contained in:
Delyan Angelov 2023-01-17 13:07:27 +02:00
parent 2034dcb4ed
commit 75d6cb9c3a
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED

View File

@ -87,6 +87,7 @@ mut:
// increases for `x := optfn() or { statement_list3 }`;
files []ast.File
expr_level int // to avoid infinite recursion segfaults due to compiler bugs
ensure_generic_type_level int // to avoid infinite recursion segfaults in ensure_generic_type_specify_type_names
cur_orm_ts ast.TypeSymbol
cur_anon_fn &ast.AnonFn = unsafe { nil }
error_details []string
@ -4215,8 +4216,19 @@ fn (mut c Checker) trace(fbase string, message string) {
fn (mut c Checker) ensure_generic_type_specify_type_names(typ ast.Type, pos token.Pos) ? {
if typ == 0 {
c.error('unknown type', pos)
return
return none
}
c.ensure_generic_type_level++
defer {
c.ensure_generic_type_level--
}
if c.ensure_generic_type_level > checker.expr_level_cutoff_limit {
c.error('checker: too many levels of Checker.ensure_generic_type_specify_type_names calls: ${c.ensure_generic_type_level} ',
pos)
return none
}
sym := c.table.final_sym(typ)
match sym.kind {
.function {