From 99e4fe9de1b640e31e29e12ca433249983f30fb6 Mon Sep 17 00:00:00 2001 From: Miltiadis Doulgeris Date: Mon, 2 Jun 2025 23:19:44 +0300 Subject: [PATCH] fix: ResolverTypeProvider data race Kubernetes-commit: de1d6fbf2422eb1da7a1fe38e0d0d6b3bfc53fd1 --- pkg/cel/common/typeprovider.go | 20 +++++--------------- pkg/cel/common/typeprovider_test.go | 2 +- pkg/cel/mutation/typeresolver_test.go | 4 ++-- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/pkg/cel/common/typeprovider.go b/pkg/cel/common/typeprovider.go index 685a585c7..7d9721933 100644 --- a/pkg/cel/common/typeprovider.go +++ b/pkg/cel/common/typeprovider.go @@ -105,23 +105,13 @@ func (p *ResolverTypeProvider) FindIdent(identName string) (ref.Val, bool) { return p.underlyingTypeProvider.FindIdent(identName) } -// ResolverEnvOption creates the ResolverTypeProvider with a given DynamicTypeResolver, -// and also returns the CEL ResolverEnvOption to apply it to the env. +// ResolverEnvOption creates the ResolverTypeProvider with a given DynamicTypeResolver +// and returns the CEL ResolverEnvOption to apply it to the env. func ResolverEnvOption(resolver TypeResolver) cel.EnvOption { - _, envOpt := NewResolverTypeProviderAndEnvOption(resolver) - return envOpt -} - -// NewResolverTypeProviderAndEnvOption creates the ResolverTypeProvider with a given DynamicTypeResolver, -// and also returns the CEL ResolverEnvOption to apply it to the env. -func NewResolverTypeProviderAndEnvOption(resolver TypeResolver) (*ResolverTypeProvider, cel.EnvOption) { - tp := &ResolverTypeProvider{typeResolver: resolver} - var envOption cel.EnvOption = func(e *cel.Env) (*cel.Env, error) { - // wrap the existing type provider (acquired from the env) - // and set new type provider for the env. - tp.underlyingTypeProvider = e.CELTypeProvider() + return func(e *cel.Env) (*cel.Env, error) { + tp := &ResolverTypeProvider{typeResolver: resolver, underlyingTypeProvider: e.CELTypeProvider()} + // set new type provider for the env. typeProviderOption := cel.CustomTypeProvider(tp) return typeProviderOption(e) } - return tp, envOption } diff --git a/pkg/cel/common/typeprovider_test.go b/pkg/cel/common/typeprovider_test.go index ae21fe073..8e3d6e937 100644 --- a/pkg/cel/common/typeprovider_test.go +++ b/pkg/cel/common/typeprovider_test.go @@ -58,7 +58,7 @@ func TestTypeProvider(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { - _, option := NewResolverTypeProviderAndEnvOption(&mockTypeResolver{}) + option := ResolverEnvOption(&mockTypeResolver{}) env := mustCreateEnv(t, option) ast, issues := env.Compile(tc.expression) if len(tc.expectCompileError) > 0 { diff --git a/pkg/cel/mutation/typeresolver_test.go b/pkg/cel/mutation/typeresolver_test.go index 126729e54..0338fb10f 100644 --- a/pkg/cel/mutation/typeresolver_test.go +++ b/pkg/cel/mutation/typeresolver_test.go @@ -212,7 +212,7 @@ func TestTypeResolver(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { - _, option := common.NewResolverTypeProviderAndEnvOption(&DynamicTypeResolver{}) + option := common.ResolverEnvOption(&DynamicTypeResolver{}) env := mustCreateEnv(t, option) ast, issues := env.Compile(tc.expression) if len(tc.expectCompileError) > 0 { @@ -307,7 +307,7 @@ func TestCELOptional(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { - _, option := common.NewResolverTypeProviderAndEnvOption(&DynamicTypeResolver{}) + option := common.ResolverEnvOption(&DynamicTypeResolver{}) env := mustCreateEnvWithOptional(t, option) ast, issues := env.Compile(tc.expression) if len(tc.expectedCompileError) > 0 {