From 8a2bc0b9fd6fccdc359858182a74ef341a6437fd Mon Sep 17 00:00:00 2001 From: Mitch Phillips Date: Thu, 17 Oct 2019 15:04:01 -0700 Subject: [PATCH] Re-plumb fuzz corpora. Re-plumb the fuzz corpora through an intermediates directory. Previously, due to the way that LOCAL_TEST_DATA is implemented, we would break when corpora were included: a) outside of a corpus/ directory, or b) not directly under the module directory (i.e. my_module/subdir/corpus) Corpora are now written into an intermediates directory so that they play nice with LOCAL_TEST_DATA, because unfortunately the key-value pair required there is not as simple as source:destination. Test: m example_fuzzer && ls \ $ANDROID_PRODUCT_OUT/data/fuzz/arm64/example_fuzzer/corpus Bug: N/A Change-Id: I5888b06ed349781c6712f1ae77cc3582283a9552 --- cc/androidmk.go | 10 ++++------ cc/fuzz.go | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cc/androidmk.go b/cc/androidmk.go index f1d329f9c..9a98b0eb4 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -308,15 +308,13 @@ func (fuzz *fuzzBinary) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkDa var fuzzFiles []string for _, d := range fuzz.corpus { - rel := d.Rel() - path := d.String() - path = strings.TrimSuffix(path, rel) - fuzzFiles = append(fuzzFiles, path+":corpus/"+d.Base()) + fuzzFiles = append(fuzzFiles, + filepath.Dir(fuzz.corpusIntermediateDir.String())+":corpus/"+d.Base()) } if fuzz.dictionary != nil { - path := strings.TrimSuffix(fuzz.dictionary.String(), fuzz.dictionary.Rel()) - fuzzFiles = append(fuzzFiles, path+":"+fuzz.dictionary.Base()) + fuzzFiles = append(fuzzFiles, + filepath.Dir(fuzz.dictionary.String())+":"+fuzz.dictionary.Base()) } if len(fuzzFiles) > 0 { diff --git a/cc/fuzz.go b/cc/fuzz.go index e65e8ded7..a99b0bb12 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -53,9 +53,10 @@ type fuzzBinary struct { *binaryDecorator *baseCompiler - Properties FuzzProperties - corpus android.Paths - dictionary android.Path + Properties FuzzProperties + dictionary android.Path + corpus android.Paths + corpusIntermediateDir android.Path } func (fuzz *fuzzBinary) linkerProps() []interface{} { @@ -103,6 +104,16 @@ func (fuzz *fuzzBinary) install(ctx ModuleContext, file android.Path) { fuzz.binaryDecorator.baseInstaller.install(ctx, file) fuzz.corpus = android.PathsForModuleSrc(ctx, fuzz.Properties.Corpus) + builder := android.NewRuleBuilder() + intermediateDir := android.PathForModuleOut(ctx, "corpus") + for _, entry := range fuzz.corpus { + builder.Command().Text("cp"). + Input(entry). + Output(intermediateDir.Join(ctx, entry.Base())) + } + builder.Build(pctx, ctx, "copy_corpus", "copy corpus") + fuzz.corpusIntermediateDir = intermediateDir + if fuzz.Properties.Dictionary != nil { fuzz.dictionary = android.PathForModuleSrc(ctx, *fuzz.Properties.Dictionary) if fuzz.dictionary.Ext() != ".dict" {