Merge "Fix a race problem in sandboxing genrule logic."

This commit is contained in:
Yu Liu
2023-06-14 04:38:55 +00:00
committed by Gerrit Code Review

View File

@@ -24,7 +24,6 @@ import (
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
"sync"
"android/soong/bazel/cquery" "android/soong/bazel/cquery"
@@ -61,12 +60,6 @@ var PrepareForIntegrationTestWithGenrule = android.GroupFixturePreparers(
PrepareForTestWithGenRuleBuildComponents, PrepareForTestWithGenRuleBuildComponents,
) )
var DepfileAllowSet map[string]bool
var SandboxingDenyModuleSet map[string]bool
var SandboxingDenyPathSet map[string]bool
var SandboxingDenyModuleSetLock sync.Mutex
var DepfileAllowSetLock sync.Mutex
func RegisterGenruleBuildComponents(ctx android.RegistrationContext) { func RegisterGenruleBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("genrule_defaults", defaultsFactory) ctx.RegisterModuleType("genrule_defaults", defaultsFactory)
@@ -618,15 +611,10 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Allowlist genrule to use depfile until we have a solution to remove it. // Allowlist genrule to use depfile until we have a solution to remove it.
// TODO(b/235582219): Remove allowlist for genrule // TODO(b/235582219): Remove allowlist for genrule
if Bool(g.properties.Depfile) { if Bool(g.properties.Depfile) {
if DepfileAllowSet == nil { sandboxingAllowlistSets := getSandboxingAllowlistSets(ctx)
DepfileAllowSetLock.Lock()
defer DepfileAllowSetLock.Unlock()
DepfileAllowSet = map[string]bool{}
android.AddToStringSet(DepfileAllowSet, DepfileAllowList)
}
// TODO(b/283852474): Checking the GenruleSandboxing flag is temporary in // TODO(b/283852474): Checking the GenruleSandboxing flag is temporary in
// order to pass the presubmit before internal master is updated. // order to pass the presubmit before internal master is updated.
if ctx.DeviceConfig().GenruleSandboxing() && !DepfileAllowSet[g.Name()] { if ctx.DeviceConfig().GenruleSandboxing() && !sandboxingAllowlistSets.depfileAllowSet[g.Name()] {
ctx.PropertyErrorf( ctx.PropertyErrorf(
"depfile", "depfile",
"Deprecated to ensure the module type is convertible to Bazel. "+ "Deprecated to ensure the module type is convertible to Bazel. "+
@@ -1067,20 +1055,37 @@ func DefaultsFactory(props ...interface{}) android.Module {
return module return module
} }
var sandboxingAllowlistKey = android.NewOnceKey("genruleSandboxingAllowlistKey")
type sandboxingAllowlistSets struct {
sandboxingDenyModuleSet map[string]bool
sandboxingDenyPathSet map[string]bool
depfileAllowSet map[string]bool
}
func getSandboxingAllowlistSets(ctx android.PathContext) *sandboxingAllowlistSets {
return ctx.Config().Once(sandboxingAllowlistKey, func() interface{} {
sandboxingDenyModuleSet := map[string]bool{}
sandboxingDenyPathSet := map[string]bool{}
depfileAllowSet := map[string]bool{}
android.AddToStringSet(sandboxingDenyModuleSet, append(DepfileAllowList, SandboxingDenyModuleList...))
android.AddToStringSet(sandboxingDenyPathSet, SandboxingDenyPathList)
android.AddToStringSet(depfileAllowSet, DepfileAllowList)
return &sandboxingAllowlistSets{
sandboxingDenyModuleSet: sandboxingDenyModuleSet,
sandboxingDenyPathSet: sandboxingDenyPathSet,
depfileAllowSet: depfileAllowSet,
}
}).(*sandboxingAllowlistSets)
}
func getSandboxedRuleBuilder(ctx android.ModuleContext, r *android.RuleBuilder) *android.RuleBuilder { func getSandboxedRuleBuilder(ctx android.ModuleContext, r *android.RuleBuilder) *android.RuleBuilder {
if !ctx.DeviceConfig().GenruleSandboxing() { if !ctx.DeviceConfig().GenruleSandboxing() {
return r.SandboxTools() return r.SandboxTools()
} }
if SandboxingDenyModuleSet == nil { sandboxingAllowlistSets := getSandboxingAllowlistSets(ctx)
SandboxingDenyModuleSetLock.Lock() if sandboxingAllowlistSets.sandboxingDenyPathSet[ctx.ModuleDir()] ||
defer SandboxingDenyModuleSetLock.Unlock() sandboxingAllowlistSets.sandboxingDenyModuleSet[ctx.ModuleName()] {
SandboxingDenyModuleSet = map[string]bool{}
SandboxingDenyPathSet = map[string]bool{}
android.AddToStringSet(SandboxingDenyModuleSet, append(DepfileAllowList, SandboxingDenyModuleList...))
android.AddToStringSet(SandboxingDenyPathSet, SandboxingDenyPathList)
}
if SandboxingDenyPathSet[ctx.ModuleDir()] || SandboxingDenyModuleSet[ctx.ModuleName()] {
return r.SandboxTools() return r.SandboxTools()
} }
return r.SandboxInputs() return r.SandboxInputs()