From 0311dedb3bf5cd63aaa144f592933f2fd6e19541 Mon Sep 17 00:00:00 2001 From: Michael Smithhisler Date: Thu, 16 Oct 2025 14:50:53 -0400 Subject: [PATCH 1/2] Add default for MaxExpressions Evaluating large numbers of expressions causes memory consumption to balloon significantly. While this can be set by consumers of the library, it is helpful to set a sane default that can be overridden if a user chooses. This reduces the likelihood of accidental OOM failures. --- CHANGELOG.md | 3 ++- bexpr.go | 3 +++ bexpr_test.go | 11 ++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfc7788..7c513ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ ### Improvements ### Changes +- Adds a default for max expressions to be evaluated. ### Fixed -### Security \ No newline at end of file +### Security diff --git a/bexpr.go b/bexpr.go index 4b5a35c..5fff012 100644 --- a/bexpr.go +++ b/bexpr.go @@ -39,6 +39,9 @@ func CreateEvaluator(expression string, opts ...Option) (*Evaluator, error) { var parserOpts []grammar.Option if parsedOpts.withMaxExpressions != 0 { parserOpts = append(parserOpts, grammar.MaxExpressions(parsedOpts.withMaxExpressions)) + } else { + // Use sane default as large expressions consume significant memory + parserOpts = append(parserOpts, grammar.MaxExpressions(2000000)) } ast, err := grammar.Parse("", []byte(expression), parserOpts...) diff --git a/bexpr_test.go b/bexpr_test.go index 3e0898f..2f11b94 100644 --- a/bexpr_test.go +++ b/bexpr_test.go @@ -21,18 +21,23 @@ func TestCreateEvaluator(t *testing.T) { "basic": { expression: "foo == 3", }, + "default max expressions": { + expression: "((((((((foo == 1))))))))", + // typo in pigeon code-gen + err: "max number of expresssions parsed", + }, } for name, tcase := range tests { - name := name - tcase := tcase t.Run(name, func(t *testing.T) { t.Parallel() - expr, err := CreateEvaluator(tcase.expression) if tcase.err == "" { require.NoError(t, err) require.NotNil(t, expr) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tcase.err) } }) } From 1550e85d0c770ca4f85197066cf1b64b0d08c4d1 Mon Sep 17 00:00:00 2001 From: Michael Smithhisler Date: Thu, 16 Oct 2025 16:24:21 -0400 Subject: [PATCH 2/2] update changelog and godoc --- CHANGELOG.md | 2 +- bexpr.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c513ac..895a749 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### Improvements ### Changes -- Adds a default for max expressions to be evaluated. +- Adds a default of 2 million for max evaluated expressions. ### Fixed diff --git a/bexpr.go b/bexpr.go index 5fff012..de7c5e8 100644 --- a/bexpr.go +++ b/bexpr.go @@ -32,6 +32,7 @@ type Evaluator struct { // CreateEvaluator is used to create and configure a new Evaluator, the expression // will be used by the evaluator when evaluating against any supplied datum. +// By default the evaluator will error after 2 million expressions. // The following Option types are supported: // WithHookFn, WithMaxExpressions, WithTagName, WithUnknownValue. func CreateEvaluator(expression string, opts ...Option) (*Evaluator, error) {