diff options
Diffstat (limited to 'fuzz')
-rw-r--r-- | fuzz/fuzz_common.go | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/fuzz/fuzz_common.go b/fuzz/fuzz_common.go index ccadc0ff2..8861d1b6b 100644 --- a/fuzz/fuzz_common.go +++ b/fuzz/fuzz_common.go @@ -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 +} |