diff options
| -rw-r--r-- | cc/cc.go | 2 | ||||
| -rw-r--r-- | cc/fuzz.go | 57 | ||||
| -rw-r--r-- | cc/linkable.go | 2 | ||||
| -rw-r--r-- | fuzz/fuzz_common.go | 14 | ||||
| -rw-r--r-- | java/fuzz.go | 4 | ||||
| -rw-r--r-- | rust/fuzz.go | 10 | ||||
| -rw-r--r-- | rust/rust.go | 2 | ||||
| -rw-r--r-- | zip/cmd/main.go | 10 | ||||
| -rw-r--r-- | zip/zip.go | 15 | ||||
| -rw-r--r-- | zip/zip_test.go | 70 |
10 files changed, 153 insertions, 33 deletions
@@ -1086,7 +1086,7 @@ func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule { panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName())) } -func (c *Module) FuzzSharedLibraries() android.Paths { +func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls { if fuzzer, ok := c.compiler.(*fuzzBinary); ok { return fuzzer.sharedLibraries } diff --git a/cc/fuzz.go b/cc/fuzz.go index 7aa8b91c7..dfefc11f2 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -103,7 +103,7 @@ type fuzzBinary struct { *baseCompiler fuzzPackagedModule fuzz.FuzzPackagedModule installedSharedDeps []string - sharedLibraries android.Paths + sharedLibraries android.RuleBuilderInstalls } func (fuzz *fuzzBinary) fuzzBinary() bool { @@ -213,19 +213,19 @@ func IsValidSharedDependency(dependency android.Module) bool { } func SharedLibraryInstallLocation( - libraryPath android.Path, isHost bool, fuzzDir string, archString string) string { + libraryBase string, isHost bool, fuzzDir string, archString string) string { installLocation := "$(PRODUCT_OUT)/data" if isHost { installLocation = "$(HOST_OUT)" } installLocation = filepath.Join( - installLocation, fuzzDir, archString, "lib", libraryPath.Base()) + installLocation, fuzzDir, archString, "lib", libraryBase) return installLocation } // Get the device-only shared library symbols install directory. -func SharedLibrarySymbolsInstallLocation(libraryPath android.Path, fuzzDir string, archString string) string { - return filepath.Join("$(PRODUCT_OUT)/symbols/data/", fuzzDir, archString, "/lib/", libraryPath.Base()) +func SharedLibrarySymbolsInstallLocation(libraryBase string, fuzzDir string, archString string) string { + return filepath.Join("$(PRODUCT_OUT)/symbols/data/", fuzzDir, archString, "/lib/", libraryBase) } func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) { @@ -242,15 +242,16 @@ func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) { // Grab the list of required shared libraries. fuzzBin.sharedLibraries, _ = CollectAllSharedDependencies(ctx) - for _, lib := range fuzzBin.sharedLibraries { + for _, ruleBuilderInstall := range fuzzBin.sharedLibraries { + install := ruleBuilderInstall.To fuzzBin.installedSharedDeps = append(fuzzBin.installedSharedDeps, SharedLibraryInstallLocation( - lib, ctx.Host(), installBase, ctx.Arch().ArchType.String())) + install, ctx.Host(), installBase, ctx.Arch().ArchType.String())) // Also add the dependency on the shared library symbols dir. if !ctx.Host() { fuzzBin.installedSharedDeps = append(fuzzBin.installedSharedDeps, - SharedLibrarySymbolsInstallLocation(lib, installBase, ctx.Arch().ArchType.String())) + SharedLibrarySymbolsInstallLocation(install, installBase, ctx.Arch().ArchType.String())) } } } @@ -422,7 +423,7 @@ func (s *ccRustFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) files = append(files, GetSharedLibsToZip(ccModule.FuzzSharedLibraries(), ccModule, &s.FuzzPackager, archString, sharedLibsInstallDirPrefix, &sharedLibraryInstalled)...) // The executable. - files = append(files, fuzz.FileToZip{android.OutputFileForModule(ctx, ccModule, "unstripped"), ""}) + files = append(files, fuzz.FileToZip{SourceFilePath: android.OutputFileForModule(ctx, ccModule, "unstripped")}) archDirs[archOs], ok = s.BuildZipFile(ctx, module, fpm, files, builder, archDir, archString, hostOrTargetString, archOs, archDirs) if !ok { @@ -453,19 +454,25 @@ func (s *ccRustFuzzPackager) MakeVars(ctx android.MakeVarsContext) { // GetSharedLibsToZip finds and marks all the transiently-dependent shared libraries for // packaging. -func GetSharedLibsToZip(sharedLibraries android.Paths, module LinkableInterface, s *fuzz.FuzzPackager, archString string, destinationPathPrefix string, sharedLibraryInstalled *map[string]bool) []fuzz.FileToZip { +func GetSharedLibsToZip(sharedLibraries android.RuleBuilderInstalls, module LinkableInterface, s *fuzz.FuzzPackager, archString string, destinationPathPrefix string, sharedLibraryInstalled *map[string]bool) []fuzz.FileToZip { var files []fuzz.FileToZip fuzzDir := "fuzz" - for _, library := range sharedLibraries { - files = append(files, fuzz.FileToZip{library, destinationPathPrefix}) + for _, ruleBuilderInstall := range sharedLibraries { + library := ruleBuilderInstall.From + install := ruleBuilderInstall.To + files = append(files, fuzz.FileToZip{ + SourceFilePath: library, + DestinationPathPrefix: destinationPathPrefix, + DestinationPath: install, + }) // For each architecture-specific shared library dependency, we need to // install it to the output directory. Setup the install destination here, // which will be used by $(copy-many-files) in the Make backend. installDestination := SharedLibraryInstallLocation( - library, module.Host(), fuzzDir, archString) + install, module.Host(), fuzzDir, archString) if (*sharedLibraryInstalled)[installDestination] { continue } @@ -483,7 +490,7 @@ func GetSharedLibsToZip(sharedLibraries android.Paths, module LinkableInterface, // we want symbolization tools (like `stack`) to be able to find the symbols // in $ANDROID_PRODUCT_OUT/symbols automagically. if !module.Host() { - symbolsInstallDestination := SharedLibrarySymbolsInstallLocation(library, fuzzDir, archString) + symbolsInstallDestination := SharedLibrarySymbolsInstallLocation(install, fuzzDir, archString) symbolsInstallDestination = strings.ReplaceAll(symbolsInstallDestination, "$", "$$") s.SharedLibInstallStrings = append(s.SharedLibInstallStrings, library.String()+":"+symbolsInstallDestination) @@ -497,12 +504,12 @@ func GetSharedLibsToZip(sharedLibraries android.Paths, module LinkableInterface, // VisitDirectDeps is used first to avoid incorrectly using 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.ModuleContext) (android.Paths, []android.Module) { +func CollectAllSharedDependencies(ctx android.ModuleContext) (android.RuleBuilderInstalls, []android.Module) { seen := make(map[string]bool) recursed := make(map[string]bool) deps := []android.Module{} - var sharedLibraries android.Paths + var sharedLibraries android.RuleBuilderInstalls // Enumerate the first level of dependencies, as we discard all non-library // modules in the BFS loop below. @@ -510,22 +517,36 @@ func CollectAllSharedDependencies(ctx android.ModuleContext) (android.Paths, []a if !IsValidSharedDependency(dep) { return } + if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) { + return + } if seen[ctx.OtherModuleName(dep)] { return } seen[ctx.OtherModuleName(dep)] = true deps = append(deps, dep) - sharedLibraries = append(sharedLibraries, android.OutputFileForModule(ctx, dep, "unstripped")) + + sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo) + installDestination := sharedLibraryInfo.SharedLibrary.Base() + ruleBuilderInstall := android.RuleBuilderInstall{android.OutputFileForModule(ctx, dep, "unstripped"), installDestination} + sharedLibraries = append(sharedLibraries, ruleBuilderInstall) }) ctx.WalkDeps(func(child, parent android.Module) bool { if !IsValidSharedDependency(child) { return false } + if !ctx.OtherModuleHasProvider(child, SharedLibraryInfoProvider) { + return false + } if !seen[ctx.OtherModuleName(child)] { seen[ctx.OtherModuleName(child)] = true deps = append(deps, child) - sharedLibraries = append(sharedLibraries, android.OutputFileForModule(ctx, child, "unstripped")) + + sharedLibraryInfo := ctx.OtherModuleProvider(child, SharedLibraryInfoProvider).(SharedLibraryInfo) + installDestination := sharedLibraryInfo.SharedLibrary.Base() + ruleBuilderInstall := android.RuleBuilderInstall{android.OutputFileForModule(ctx, child, "unstripped"), installDestination} + sharedLibraries = append(sharedLibraries, ruleBuilderInstall) } if recursed[ctx.OtherModuleName(child)] { diff --git a/cc/linkable.go b/cc/linkable.go index 9578807f8..557f5d2b3 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -130,7 +130,7 @@ type LinkableInterface interface { // FuzzSharedLibraries returns the shared library dependencies for this module. // Expects that IsFuzzModule returns true. - FuzzSharedLibraries() android.Paths + FuzzSharedLibraries() android.RuleBuilderInstalls Device() bool Host() bool diff --git a/fuzz/fuzz_common.go b/fuzz/fuzz_common.go index f76529d31..2a1b40452 100644 --- a/fuzz/fuzz_common.go +++ b/fuzz/fuzz_common.go @@ -61,6 +61,7 @@ type FuzzPackager struct { type FileToZip struct { SourceFilePath android.Path DestinationPathPrefix string + DestinationPath string } type ArchOs struct { @@ -443,7 +444,7 @@ func (s *FuzzPackager) PackageArtifacts(ctx android.SingletonContext, module and FlagWithOutput("-o ", corpusZip) rspFile := corpusZip.ReplaceExtension(ctx, "rsp") command.FlagWithRspFileInputList("-r ", rspFile, fuzzModule.Corpus) - files = append(files, FileToZip{corpusZip, ""}) + files = append(files, FileToZip{SourceFilePath: corpusZip}) } // Package the data into a zipfile. @@ -456,17 +457,17 @@ func (s *FuzzPackager) PackageArtifacts(ctx android.SingletonContext, module and command.FlagWithArg("-C ", intermediateDir) command.FlagWithInput("-f ", f) } - files = append(files, FileToZip{dataZip, ""}) + files = append(files, FileToZip{SourceFilePath: dataZip}) } // The dictionary. if fuzzModule.Dictionary != nil { - files = append(files, FileToZip{fuzzModule.Dictionary, ""}) + files = append(files, FileToZip{SourceFilePath: fuzzModule.Dictionary}) } // Additional fuzz config. if fuzzModule.Config != nil && IsValidConfig(fuzzModule, module.Name()) { - files = append(files, FileToZip{fuzzModule.Config, ""}) + files = append(files, FileToZip{SourceFilePath: fuzzModule.Config}) } return files @@ -485,6 +486,9 @@ func (s *FuzzPackager) BuildZipFile(ctx android.SingletonContext, module android } else { command.Flag("-P ''") } + if file.DestinationPath != "" { + command.FlagWithArg("-e ", file.DestinationPath) + } command.FlagWithInput("-f ", file.SourceFilePath) } @@ -502,7 +506,7 @@ func (s *FuzzPackager) BuildZipFile(ctx android.SingletonContext, module android } s.FuzzTargets[module.Name()] = true - archDirs[archOs] = append(archDirs[archOs], FileToZip{fuzzZip, ""}) + archDirs[archOs] = append(archDirs[archOs], FileToZip{SourceFilePath: fuzzZip}) return archDirs[archOs], true } diff --git a/java/fuzz.go b/java/fuzz.go index 1d6b91346..9a0c908a0 100644 --- a/java/fuzz.go +++ b/java/fuzz.go @@ -250,11 +250,11 @@ func generateBuildActions(s *fuzz.FuzzPackager, hostOrTargetString string, ctx a files = s.PackageArtifacts(ctx, module, javaFuzzModule.fuzzPackagedModule, archDir, builder) // Add .jar - files = append(files, fuzz.FileToZip{javaFuzzModule.implementationJarFile, ""}) + files = append(files, fuzz.FileToZip{SourceFilePath: javaFuzzModule.implementationJarFile}) // Add jni .so files for _, fPath := range javaFuzzModule.jniFilePaths { - files = append(files, fuzz.FileToZip{fPath, ""}) + files = append(files, fuzz.FileToZip{SourceFilePath: fPath}) } archDirs[archOs], ok = s.BuildZipFile(ctx, module, javaFuzzModule.fuzzPackagedModule, files, builder, archDir, archString, hostOrTargetString, archOs, archDirs) diff --git a/rust/fuzz.go b/rust/fuzz.go index d7e7ddfff..c2b940525 100644 --- a/rust/fuzz.go +++ b/rust/fuzz.go @@ -31,7 +31,7 @@ type fuzzDecorator struct { *binaryDecorator fuzzPackagedModule fuzz.FuzzPackagedModule - sharedLibraries android.Paths + sharedLibraries android.RuleBuilderInstalls installedSharedDeps []string } @@ -119,15 +119,17 @@ func (fuzz *fuzzDecorator) install(ctx ModuleContext) { // Grab the list of required shared libraries. fuzz.sharedLibraries, _ = cc.CollectAllSharedDependencies(ctx) - for _, lib := range fuzz.sharedLibraries { + for _, ruleBuilderInstall := range fuzz.sharedLibraries { + install := ruleBuilderInstall.To + fuzz.installedSharedDeps = append(fuzz.installedSharedDeps, cc.SharedLibraryInstallLocation( - lib, ctx.Host(), installBase, ctx.Arch().ArchType.String())) + install, ctx.Host(), installBase, ctx.Arch().ArchType.String())) // Also add the dependency on the shared library symbols dir. if !ctx.Host() { fuzz.installedSharedDeps = append(fuzz.installedSharedDeps, - cc.SharedLibrarySymbolsInstallLocation(lib, installBase, ctx.Arch().ArchType.String())) + cc.SharedLibrarySymbolsInstallLocation(install, installBase, ctx.Arch().ArchType.String())) } } } diff --git a/rust/rust.go b/rust/rust.go index 7b520cdb0..dc53cc028 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -649,7 +649,7 @@ func (mod *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule { panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", mod.BaseModuleName())) } -func (mod *Module) FuzzSharedLibraries() android.Paths { +func (mod *Module) FuzzSharedLibraries() android.RuleBuilderInstalls { if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok { return fuzzer.sharedLibraries } diff --git a/zip/cmd/main.go b/zip/cmd/main.go index def76aa62..a2ccc2011 100644 --- a/zip/cmd/main.go +++ b/zip/cmd/main.go @@ -78,6 +78,15 @@ func (rspFiles) Set(s string) error { return nil } +type explicitFile struct{} + +func (explicitFile) String() string { return `""` } + +func (explicitFile) Set(s string) error { + fileArgsBuilder.ExplicitPathInZip(s) + return nil +} + type dir struct{} func (dir) String() string { return `""` } @@ -173,6 +182,7 @@ func main() { flags.Var(&nonDeflatedFiles, "s", "file path to be stored within the zip without compression") flags.Var(&relativeRoot{}, "C", "path to use as relative root of files in following -f, -l, or -D arguments") flags.Var(&junkPaths{}, "j", "junk paths, zip files without directory names") + flags.Var(&explicitFile{}, "e", "filename to use in the zip file for the next -f argument") flags.Parse(expandedArgs[1:]) diff --git a/zip/zip.go b/zip/zip.go index 6f1a8adaf..5e1a10462 100644 --- a/zip/zip.go +++ b/zip/zip.go @@ -80,6 +80,7 @@ type pathMapping struct { type FileArg struct { PathPrefixInZip, SourcePrefixToStrip string + ExplicitPathInZip string SourceFiles []string JunkPaths bool GlobDir string @@ -124,6 +125,10 @@ func (b *FileArgsBuilder) File(name string) *FileArgsBuilder { arg := b.state arg.SourceFiles = []string{name} b.fileArgs = append(b.fileArgs, arg) + + if b.state.ExplicitPathInZip != "" { + b.state.ExplicitPathInZip = "" + } return b } @@ -189,6 +194,12 @@ func (b *FileArgsBuilder) RspFile(name string) *FileArgsBuilder { return b } +// ExplicitPathInZip sets the path in the zip file for the next File call. +func (b *FileArgsBuilder) ExplicitPathInZip(s string) *FileArgsBuilder { + b.state.ExplicitPathInZip = s + return b +} + func (b *FileArgsBuilder) Error() error { if b == nil { return nil @@ -425,7 +436,9 @@ func fillPathPairs(fa FileArg, src string, pathMappings *[]pathMapping, var dest string - if fa.JunkPaths { + if fa.ExplicitPathInZip != "" { + dest = fa.ExplicitPathInZip + } else if fa.JunkPaths { dest = filepath.Base(src) } else { var err error diff --git a/zip/zip_test.go b/zip/zip_test.go index e7fdea839..c64c3f499 100644 --- a/zip/zip_test.go +++ b/zip/zip_test.go @@ -454,6 +454,60 @@ func TestZip(t *testing.T) { fhWithSHA256("c", fileC, zip.Deflate, sha256FileC), }, }, + { + name: "explicit path", + args: fileArgsBuilder(). + ExplicitPathInZip("foo"). + File("a/a/a"). + File("a/a/b"), + compressionLevel: 9, + + files: []zip.FileHeader{ + fh("foo", fileA, zip.Deflate), + fh("a/a/b", fileB, zip.Deflate), + }, + }, + { + name: "explicit path with prefix", + args: fileArgsBuilder(). + PathPrefixInZip("prefix"). + ExplicitPathInZip("foo"). + File("a/a/a"). + File("a/a/b"), + compressionLevel: 9, + + files: []zip.FileHeader{ + fh("prefix/foo", fileA, zip.Deflate), + fh("prefix/a/a/b", fileB, zip.Deflate), + }, + }, + { + name: "explicit path with glob", + args: fileArgsBuilder(). + ExplicitPathInZip("foo"). + File("a/a/a*"). + File("a/a/b"), + compressionLevel: 9, + + files: []zip.FileHeader{ + fh("foo", fileA, zip.Deflate), + fh("a/a/b", fileB, zip.Deflate), + }, + }, + { + name: "explicit path with junk paths", + args: fileArgsBuilder(). + JunkPaths(true). + ExplicitPathInZip("foo/bar"). + File("a/a/a*"). + File("a/a/b"), + compressionLevel: 9, + + files: []zip.FileHeader{ + fh("foo/bar", fileA, zip.Deflate), + fh("b", fileB, zip.Deflate), + }, + }, // errors { @@ -490,6 +544,22 @@ func TestZip(t *testing.T) { File("d/a/a"), err: ConflictingFileError{}, }, + { + name: "error explicit path conflicting", + args: fileArgsBuilder(). + ExplicitPathInZip("foo"). + File("a/a/a"). + ExplicitPathInZip("foo"). + File("a/a/b"), + err: ConflictingFileError{}, + }, + { + name: "error explicit path conflicting glob", + args: fileArgsBuilder(). + ExplicitPathInZip("foo"). + File("a/a/*"), + err: ConflictingFileError{}, + }, } for _, test := range testCases { |