Avoid redundant allocation in seccomp.optimizeSyscallRuleFunc().

PiperOrigin-RevId: 586120281
This commit is contained in:
Jamie Liu
2023-11-28 15:25:20 -08:00
committed by gVisor bot
parent 8e36d125da
commit 9cf9d1d01d
+11 -3
View File
@@ -191,11 +191,19 @@ func deduplicatePerArgs[T Or | And](rule SyscallRule) (SyscallRule, bool) {
// An optimizer will be exhausted before the next one is ever run.
// Earlier optimizers are re-exhausted if later optimizers cause change.
func optimizeSyscallRuleFuncs(rule SyscallRule, funcs []ruleOptimizerFunc) SyscallRule {
// Instantiate this closure only once, since passing it to (interface
// method) rule.Recurse() causes it to escape.
var recurse func(subRule SyscallRule) SyscallRule
recurse = func(subRule SyscallRule) SyscallRule {
return optimizeSyscallRuleFuncsRecursive(subRule, funcs, recurse)
}
return optimizeSyscallRuleFuncsRecursive(rule, funcs, recurse)
}
func optimizeSyscallRuleFuncsRecursive(rule SyscallRule, funcs []ruleOptimizerFunc, recurse func(subRule SyscallRule) SyscallRule) SyscallRule {
for changed := true; changed; {
for _, fn := range funcs {
rule.Recurse(func(subRule SyscallRule) SyscallRule {
return optimizeSyscallRuleFuncs(subRule, funcs)
})
rule.Recurse(recurse)
if rule, changed = fn(rule); changed {
break
}