mirror of
https://github.com/hanzoai/expr.git
synced 2026-09-24 16:58:58 +00:00
* feat: add node budget and memory limits Implement compile-time and runtime safeguards against deeply nested expressions: - Add MaxNodes limit to track and limit AST node count during parsing - Move MemoryBudget from VM to Config for better configurability - Add node creation tracking in parser to enforce node budget - Refactor node creation to check limits before allocation - Add RunWithConfig to VM for passing memory budget settings - Set reasonable defaults in Config (10000 nodes, 1M memory) - Add comprehensive tests for both node and memory limits This prevents stack overflows from malicious or poorly written expressions by failing fast with clear error messages during compilation or runtime. Signed-off-by: Ville Vesilehto <[email protected]> * Update parser.go Signed-off-by: Anton Medvedev <[email protected]> --------- Signed-off-by: Ville Vesilehto <[email protected]> Signed-off-by: Anton Medvedev <[email protected]> Co-authored-by: Anton Medvedev <[email protected]>
38 lines
590 B
Go
38 lines
590 B
Go
package vm
|
|
|
|
import (
|
|
"reflect"
|
|
"time"
|
|
)
|
|
|
|
type (
|
|
Function = func(params ...any) (any, error)
|
|
SafeFunction = func(params ...any) (any, uint, error)
|
|
)
|
|
|
|
var (
|
|
errorType = reflect.TypeOf((*error)(nil)).Elem()
|
|
)
|
|
|
|
type Scope struct {
|
|
Array reflect.Value
|
|
Index int
|
|
Len int
|
|
Count int
|
|
Acc any
|
|
}
|
|
|
|
type groupBy = map[any][]any
|
|
|
|
type Span struct {
|
|
Name string `json:"name"`
|
|
Expression string `json:"expression"`
|
|
Duration int64 `json:"duration"`
|
|
Children []*Span `json:"children"`
|
|
start time.Time
|
|
}
|
|
|
|
func GetSpan(program *Program) *Span {
|
|
return program.span
|
|
}
|