diff --git a/internal/corazawaf/rule.go b/internal/corazawaf/rule.go index 4e04ff8de..5e5ce8a59 100644 --- a/internal/corazawaf/rule.go +++ b/internal/corazawaf/rule.go @@ -5,7 +5,9 @@ package corazawaf import ( "fmt" + "hash/fnv" "regexp" + "strconv" "strings" "sync" "unsafe" @@ -585,23 +587,14 @@ func (r *Rule) AddVariableNegation(v variables.RuleVariable, key string) error { return nil } -var transformationIDToName = []string{""} -var transformationNameToID = map[string]int{"": 0} -var transformationIDsLock = sync.Mutex{} +var transformationNameToID sync.Map func transformationID(currentID int, transformationName string) int { - transformationIDsLock.Lock() - defer transformationIDsLock.Unlock() - - currName := transformationIDToName[currentID] - nextName := fmt.Sprintf("%s+%s", currName, transformationName) - if id, ok := transformationNameToID[nextName]; ok { - return id - } - - id := len(transformationIDToName) - transformationIDToName = append(transformationIDToName, nextName) - transformationNameToID[nextName] = id + nextName := strconv.Itoa(currentID) + "+" + transformationName + hasher := fnv.New64a() + hasher.Write([]byte(nextName)) + id := int(hasher.Sum64()) + transformationNameToID.LoadOrStore(id, nextName) return id } diff --git a/internal/corazawaf/rule_test.go b/internal/corazawaf/rule_test.go index d999bb0c8..2a1ea1070 100644 --- a/internal/corazawaf/rule_test.go +++ b/internal/corazawaf/rule_test.go @@ -616,3 +616,20 @@ func TestExpandMacroAfterWholeRuleEvaluation(t *testing.T) { t.Errorf("Expected ArgsGet-data, got %s", matchdata[0].Data()) } } + +func BenchmarkAddTransformationUnique(b *testing.B) { + transformation := func(input string) (string, bool, error) { + return "Test", true, nil + } + b.ResetTimer() + b.RunParallel(func(p *testing.PB) { + rule := NewRule() + for p.Next() { + transformationName := "transformation" + b.Name() + err := rule.AddTransformation(transformationName, transformation) + if err != nil { + b.Fatalf("Failed to add a transformation: %s", err.Error()) + } + } + }) +}