Merge "Fix a race problem in sandboxing genrule logic."
This commit is contained in:
@@ -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()
|
||||||
|
Reference in New Issue
Block a user