rust: Package shared libraries with fuzzer zips
Rust fuzzers were not packaging up their CC shared dependencies. This would lead to fuzzers using the shared libraries included on system, which may not be sanitized, leading to incorrect behavior. This refactors the relevant code from CC and calls it from the Rust build logic. Bug: 202282599 Test: output rust fuzzer zip file includes shared dependencies. Change-Id: I92196eb0141733797a67eae24f8e9aedea94c3bc
This commit is contained in:
@@ -42,8 +42,9 @@ type FuzzModule struct {
|
||||
}
|
||||
|
||||
type FuzzPackager struct {
|
||||
Packages android.Paths
|
||||
FuzzTargets map[string]bool
|
||||
Packages android.Paths
|
||||
FuzzTargets map[string]bool
|
||||
SharedLibInstallStrings []string
|
||||
}
|
||||
|
||||
type FileToZip struct {
|
||||
@@ -251,3 +252,42 @@ func (s *FuzzPackager) PreallocateSlice(ctx android.MakeVarsContext, targets str
|
||||
sort.Strings(fuzzTargets)
|
||||
ctx.Strict(targets, strings.Join(fuzzTargets, " "))
|
||||
}
|
||||
|
||||
// CollectAllSharedDependencies performs a breadth-first search over the provided module's
|
||||
// dependencies using `visitDirectDeps` to enumerate all shared library
|
||||
// dependencies. We require breadth-first expansion, as otherwise we may
|
||||
// incorrectly use the core libraries (sanitizer runtimes, libc, libdl, etc.)
|
||||
// from a dependency. This may cause issues when dependencies have explicit
|
||||
// sanitizer tags, as we may get a dependency on an unsanitized libc, etc.
|
||||
func CollectAllSharedDependencies(ctx android.SingletonContext, module android.Module, unstrippedOutputFile func(module android.Module) android.Path, isValidSharedDependency func(dependency android.Module) bool) android.Paths {
|
||||
var fringe []android.Module
|
||||
|
||||
seen := make(map[string]bool)
|
||||
|
||||
// Enumerate the first level of dependencies, as we discard all non-library
|
||||
// modules in the BFS loop below.
|
||||
ctx.VisitDirectDeps(module, func(dep android.Module) {
|
||||
if isValidSharedDependency(dep) {
|
||||
fringe = append(fringe, dep)
|
||||
}
|
||||
})
|
||||
|
||||
var sharedLibraries android.Paths
|
||||
|
||||
for i := 0; i < len(fringe); i++ {
|
||||
module := fringe[i]
|
||||
if seen[module.Name()] {
|
||||
continue
|
||||
}
|
||||
seen[module.Name()] = true
|
||||
|
||||
sharedLibraries = append(sharedLibraries, unstrippedOutputFile(module))
|
||||
ctx.VisitDirectDeps(module, func(dep android.Module) {
|
||||
if isValidSharedDependency(dep) && !seen[dep.Name()] {
|
||||
fringe = append(fringe, dep)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return sharedLibraries
|
||||
}
|
||||
|
Reference in New Issue
Block a user