Prevent multiple PackagingSpecs having same installation path

This fixes a bug that different PackagingSpecs having the same
installation path were silently allowed. Previously, a PackagingSpec
that comes the first for the given installation path won, effectively
eclipsing other PackagingSpecs destined for the same installation path.

Bug: 335506668
Test: go test ./...
Change-Id: Ia36f656e8364f95c4be78fff6e9dc16966307526
This commit is contained in:
Jiyong Park
2024-04-30 18:09:09 +09:00
parent 4152b192e0
commit a51c4ce10e
2 changed files with 50 additions and 2 deletions

View File

@@ -50,6 +50,25 @@ type PackagingSpec struct {
skipInstall bool skipInstall bool
} }
func (p *PackagingSpec) Equals(other *PackagingSpec) bool {
if other == nil {
return false
}
if p.relPathInPackage != other.relPathInPackage {
return false
}
if p.srcPath != other.srcPath || p.symlinkTarget != other.symlinkTarget {
return false
}
if p.executable != other.executable {
return false
}
if p.partition != other.partition {
return false
}
return true
}
// Get file name of installed package // Get file name of installed package
func (p *PackagingSpec) FileName() string { func (p *PackagingSpec) FileName() string {
if p.relPathInPackage != "" { if p.relPathInPackage != "" {
@@ -243,9 +262,15 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter
continue continue
} }
} }
if _, ok := m[ps.relPathInPackage]; !ok { dstPath := ps.relPathInPackage
m[ps.relPathInPackage] = ps if existingPs, ok := m[dstPath]; ok {
if !existingPs.Equals(&ps) {
ctx.ModuleErrorf("packaging conflict at %v:\n%v\n%v", dstPath, existingPs, ps)
}
continue
} }
m[dstPath] = ps
} }
}) })
return m return m

View File

@@ -442,3 +442,26 @@ func TestInconsistentPartitionTypesInDefaults(t *testing.T) {
} }
`) `)
} }
func TestPreventDuplicatedEntries(t *testing.T) {
fixture.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
"packaging conflict at")).
RunTestWithBp(t, `
android_filesystem {
name: "fs",
deps: [
"foo",
"foo_dup",
],
}
cc_binary {
name: "foo",
}
cc_binary {
name: "foo_dup",
stem: "foo",
}
`)
}