Skip to content

Commit

Permalink
ast: protect against too deep recursion in Expr.pos() calls
Browse files Browse the repository at this point in the history
  • Loading branch information
spytheman committed Aug 20, 2024
1 parent 911428c commit 7d81633
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions vlib/v/ast/ast.v
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
@[has_globals]
module ast

import v.token
Expand Down Expand Up @@ -2094,10 +2095,25 @@ pub fn (expr Expr) is_blank_ident() bool {
return false
}

__global nested_expr_pos_calls = 0
// values above 14000 risk stack overflow by default on macos in Expr.pos() calls
const max_nested_expr_pos_calls = 5000

pub fn (expr Expr) pos() token.Pos {
// all uncommented have to be implemented
// Note: please do not print here. the language server will hang
// as it uses STDIO primarily to communicate ~Ned
nested_expr_pos_calls++
if nested_expr_pos_calls > ast.max_nested_expr_pos_calls {
$if panic_on_deeply_nested_expr_pos_calls ? {
eprintln('${@LOCATION}: too many nested Expr.pos() calls: ${nested_expr_pos_calls}, expr type: ${expr.type_name()}')
exit(1)
}
return token.Pos{}
}
defer {
nested_expr_pos_calls--
}
return match expr {
AnonFn {
expr.decl.pos
Expand Down

0 comments on commit 7d81633

Please sign in to comment.