Merge "Revert^2 "Update the way we build AFL++ fuzz binaries""
This commit is contained in:
1
cc/cc.go
1
cc/cc.go
@@ -62,7 +62,6 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {
|
|||||||
ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
|
ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
|
||||||
|
|
||||||
ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
|
ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
|
||||||
ctx.BottomUp("fuzz", fuzzMutator)
|
|
||||||
|
|
||||||
ctx.BottomUp("coverage", coverageMutator).Parallel()
|
ctx.BottomUp("coverage", coverageMutator).Parallel()
|
||||||
|
|
||||||
|
@@ -20,6 +20,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -3342,9 +3343,9 @@ func TestErrorsIfAModuleDependsOnDisabled(t *testing.T) {
|
|||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAFLFuzzTarget(t *testing.T) {
|
func VerifyAFLFuzzTargetVariant(t *testing.T, variant string) {
|
||||||
ctx := testCc(t, `
|
bp := `
|
||||||
cc_afl_fuzz {
|
cc_fuzz {
|
||||||
name: "test_afl_fuzz_target",
|
name: "test_afl_fuzz_target",
|
||||||
srcs: ["foo.c"],
|
srcs: ["foo.c"],
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
@@ -3354,17 +3355,10 @@ func TestAFLFuzzTarget(t *testing.T) {
|
|||||||
shared_libs: [
|
shared_libs: [
|
||||||
"afl_fuzz_shared_lib",
|
"afl_fuzz_shared_lib",
|
||||||
],
|
],
|
||||||
}
|
fuzzing_frameworks: {
|
||||||
cc_fuzz {
|
afl: true,
|
||||||
name: "test_fuzz_target",
|
libfuzzer: false,
|
||||||
srcs: ["foo.c"],
|
},
|
||||||
static_libs: [
|
|
||||||
"afl_fuzz_static_lib",
|
|
||||||
"libfuzzer_only_static_lib",
|
|
||||||
],
|
|
||||||
shared_libs: [
|
|
||||||
"afl_fuzz_shared_lib",
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
cc_library {
|
cc_library {
|
||||||
name: "afl_fuzz_static_lib",
|
name: "afl_fuzz_static_lib",
|
||||||
@@ -3409,12 +3403,19 @@ func TestAFLFuzzTarget(t *testing.T) {
|
|||||||
host_supported: true,
|
host_supported: true,
|
||||||
srcs: ["second_file.c"],
|
srcs: ["second_file.c"],
|
||||||
}
|
}
|
||||||
filegroup {
|
cc_object {
|
||||||
name: "aflpp_driver",
|
name: "aflpp_driver",
|
||||||
|
host_supported: true,
|
||||||
srcs: [
|
srcs: [
|
||||||
"aflpp_driver.c",
|
"aflpp_driver.c",
|
||||||
],
|
],
|
||||||
}`)
|
}`
|
||||||
|
|
||||||
|
testEnv := map[string]string{
|
||||||
|
"FUZZ_FRAMEWORK": "AFL",
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := android.GroupFixturePreparers(prepareForCcTest, android.FixtureMergeEnv(testEnv)).RunTestWithBp(t, bp)
|
||||||
|
|
||||||
checkPcGuardFlag := func(
|
checkPcGuardFlag := func(
|
||||||
modName string, variantName string, shouldHave bool) {
|
modName string, variantName string, shouldHave bool) {
|
||||||
@@ -3434,31 +3435,33 @@ func TestAFLFuzzTarget(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, vnt := range ctx.ModuleVariantsForTests("libfuzzer_only_static_lib") {
|
|
||||||
if strings.Contains(vnt, "fuzzer_afl") {
|
|
||||||
t.Errorf("libfuzzer_only_static_lib has afl variant and should not")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
moduleName := "test_afl_fuzz_target"
|
moduleName := "test_afl_fuzz_target"
|
||||||
variantName := "android_arm64_armv8-a_fuzzer_afl"
|
checkPcGuardFlag(moduleName, variant+"_fuzzer", true)
|
||||||
checkPcGuardFlag(moduleName, variantName, true)
|
|
||||||
|
|
||||||
moduleName = "afl_fuzz_static_lib"
|
moduleName = "afl_fuzz_static_lib"
|
||||||
variantName = "android_arm64_armv8-a_static"
|
checkPcGuardFlag(moduleName, variant+"_static", false)
|
||||||
checkPcGuardFlag(moduleName, variantName, false)
|
checkPcGuardFlag(moduleName, variant+"_static_fuzzer", true)
|
||||||
checkPcGuardFlag(moduleName, variantName+"_fuzzer", false)
|
|
||||||
checkPcGuardFlag(moduleName, variantName+"_fuzzer_afl", true)
|
|
||||||
|
|
||||||
moduleName = "second_static_lib"
|
moduleName = "second_static_lib"
|
||||||
checkPcGuardFlag(moduleName, variantName, false)
|
checkPcGuardFlag(moduleName, variant+"_static", false)
|
||||||
checkPcGuardFlag(moduleName, variantName+"_fuzzer", false)
|
checkPcGuardFlag(moduleName, variant+"_static_fuzzer", true)
|
||||||
checkPcGuardFlag(moduleName, variantName+"_fuzzer_afl", true)
|
|
||||||
|
|
||||||
ctx.ModuleForTests("afl_fuzz_shared_lib",
|
ctx.ModuleForTests("afl_fuzz_shared_lib",
|
||||||
"android_arm64_armv8-a_shared").Rule("cc")
|
"android_arm64_armv8-a_shared").Rule("cc")
|
||||||
ctx.ModuleForTests("afl_fuzz_shared_lib",
|
ctx.ModuleForTests("afl_fuzz_shared_lib",
|
||||||
"android_arm64_armv8-a_shared_fuzzer_afl").Rule("cc")
|
"android_arm64_armv8-a_shared_fuzzer").Rule("cc")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAFLFuzzTargetForDevice(t *testing.T) {
|
||||||
|
VerifyAFLFuzzTargetVariant(t, "android_arm64_armv8-a")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAFLFuzzTargetForLinuxHost(t *testing.T) {
|
||||||
|
if runtime.GOOS != "linux" {
|
||||||
|
t.Skip("requires linux")
|
||||||
|
}
|
||||||
|
|
||||||
|
VerifyAFLFuzzTargetVariant(t, "linux_glibc_x86_64")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simple smoke test for the cc_fuzz target that ensures the rule compiles
|
// Simple smoke test for the cc_fuzz target that ensures the rule compiles
|
||||||
|
114
cc/fuzz.go
114
cc/fuzz.go
@@ -27,15 +27,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
android.RegisterModuleType("cc_afl_fuzz", AFLFuzzFactory)
|
|
||||||
android.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
android.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
||||||
android.RegisterSingletonType("cc_fuzz_packaging", fuzzPackagingFactory)
|
android.RegisterSingletonType("cc_fuzz_packaging", fuzzPackagingFactory)
|
||||||
android.RegisterSingletonType("cc_afl_fuzz_packaging", fuzzAFLPackagingFactory)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type FuzzProperties struct {
|
type FuzzProperties struct {
|
||||||
AFLEnabled bool `blueprint:"mutated"`
|
FuzzFramework fuzz.Framework `blueprint:"mutated"`
|
||||||
AFLAddFlags bool `blueprint:"mutated"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type fuzzer struct {
|
type fuzzer struct {
|
||||||
@@ -43,8 +40,13 @@ type fuzzer struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fuzzer *fuzzer) flags(ctx ModuleContext, flags Flags) Flags {
|
func (fuzzer *fuzzer) flags(ctx ModuleContext, flags Flags) Flags {
|
||||||
if fuzzer.Properties.AFLAddFlags {
|
if fuzzer.Properties.FuzzFramework == fuzz.AFL {
|
||||||
flags.Local.CFlags = append(flags.Local.CFlags, "-fsanitize-coverage=trace-pc-guard")
|
flags.Local.CFlags = append(flags.Local.CFlags, []string{
|
||||||
|
"-fsanitize-coverage=trace-pc-guard",
|
||||||
|
"-Wno-unused-result",
|
||||||
|
"-Wno-unused-parameter",
|
||||||
|
"-Wno-unused-function",
|
||||||
|
}...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return flags
|
return flags
|
||||||
@@ -60,7 +62,7 @@ func fuzzMutatorDeps(mctx android.TopDownMutatorContext) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if currentModule.fuzzer == nil || !currentModule.fuzzer.Properties.AFLEnabled {
|
if currentModule.fuzzer == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,48 +85,16 @@ func fuzzMutatorDeps(mctx android.TopDownMutatorContext) {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
c.fuzzer.Properties.AFLEnabled = true
|
c.fuzzer.Properties.FuzzFramework = currentModule.fuzzer.Properties.FuzzFramework
|
||||||
c.fuzzer.Properties.AFLAddFlags = true
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func fuzzMutator(mctx android.BottomUpMutatorContext) {
|
|
||||||
if c, ok := mctx.Module().(*Module); ok && c.fuzzer != nil {
|
|
||||||
if !c.fuzzer.Properties.AFLEnabled {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Binary() {
|
|
||||||
m := mctx.CreateVariations("afl")
|
|
||||||
m[0].(*Module).fuzzer.Properties.AFLEnabled = true
|
|
||||||
m[0].(*Module).fuzzer.Properties.AFLAddFlags = true
|
|
||||||
} else {
|
|
||||||
m := mctx.CreateVariations("", "afl")
|
|
||||||
m[0].(*Module).fuzzer.Properties.AFLEnabled = false
|
|
||||||
m[0].(*Module).fuzzer.Properties.AFLAddFlags = false
|
|
||||||
|
|
||||||
m[1].(*Module).fuzzer.Properties.AFLEnabled = true
|
|
||||||
m[1].(*Module).fuzzer.Properties.AFLAddFlags = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cc_fuzz creates a host/device fuzzer binary. Host binaries can be found at
|
// cc_fuzz creates a host/device fuzzer binary. Host binaries can be found at
|
||||||
// $ANDROID_HOST_OUT/fuzz/, and device binaries can be found at /data/fuzz on
|
// $ANDROID_HOST_OUT/fuzz/, and device binaries can be found at /data/fuzz on
|
||||||
// your device, or $ANDROID_PRODUCT_OUT/data/fuzz in your build tree.
|
// your device, or $ANDROID_PRODUCT_OUT/data/fuzz in your build tree.
|
||||||
func LibFuzzFactory() android.Module {
|
func LibFuzzFactory() android.Module {
|
||||||
module := NewFuzzer(android.HostAndDeviceSupported, fuzz.Cc)
|
module := NewFuzzer(android.HostAndDeviceSupported)
|
||||||
return module.Init()
|
|
||||||
}
|
|
||||||
|
|
||||||
// cc_afl_fuzz creates a host/device AFL++ fuzzer binary.
|
|
||||||
// AFL++ is an open source framework used to fuzz libraries
|
|
||||||
// Host binaries can be found at $ANDROID_HOST_OUT/afl_fuzz/ and device
|
|
||||||
// binaries can be found at $ANDROID_PRODUCT_OUT/data/afl_fuzz in your
|
|
||||||
// build tree
|
|
||||||
func AFLFuzzFactory() android.Module {
|
|
||||||
module := NewFuzzer(android.HostAndDeviceSupported, fuzz.AFL)
|
|
||||||
return module.Init()
|
return module.Init()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +103,6 @@ type fuzzBinary struct {
|
|||||||
*baseCompiler
|
*baseCompiler
|
||||||
fuzzPackagedModule fuzz.FuzzPackagedModule
|
fuzzPackagedModule fuzz.FuzzPackagedModule
|
||||||
installedSharedDeps []string
|
installedSharedDeps []string
|
||||||
fuzzType fuzz.FuzzType
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fuzz *fuzzBinary) fuzzBinary() bool {
|
func (fuzz *fuzzBinary) fuzzBinary() bool {
|
||||||
@@ -143,6 +112,7 @@ func (fuzz *fuzzBinary) fuzzBinary() bool {
|
|||||||
func (fuzz *fuzzBinary) linkerProps() []interface{} {
|
func (fuzz *fuzzBinary) linkerProps() []interface{} {
|
||||||
props := fuzz.binaryDecorator.linkerProps()
|
props := fuzz.binaryDecorator.linkerProps()
|
||||||
props = append(props, &fuzz.fuzzPackagedModule.FuzzProperties)
|
props = append(props, &fuzz.fuzzPackagedModule.FuzzProperties)
|
||||||
|
|
||||||
return props
|
return props
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,17 +121,15 @@ func (fuzz *fuzzBinary) linkerInit(ctx BaseModuleContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fuzzBin *fuzzBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
func (fuzzBin *fuzzBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||||
if fuzzBin.fuzzType == fuzz.AFL {
|
if ctx.Config().Getenv("FUZZ_FRAMEWORK") == "AFL" {
|
||||||
deps.HeaderLibs = append(deps.HeaderLibs, "libafl_headers")
|
deps.HeaderLibs = append(deps.HeaderLibs, "libafl_headers")
|
||||||
deps = fuzzBin.binaryDecorator.linkerDeps(ctx, deps)
|
|
||||||
return deps
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeLibrary(ctx.toolchain()))
|
deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeLibrary(ctx.toolchain()))
|
||||||
|
}
|
||||||
|
|
||||||
deps = fuzzBin.binaryDecorator.linkerDeps(ctx, deps)
|
deps = fuzzBin.binaryDecorator.linkerDeps(ctx, deps)
|
||||||
return deps
|
return deps
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||||
flags = fuzz.binaryDecorator.linkerFlags(ctx, flags)
|
flags = fuzz.binaryDecorator.linkerFlags(ctx, flags)
|
||||||
@@ -257,9 +225,6 @@ func sharedLibrarySymbolsInstallLocation(libraryPath android.Path, fuzzDir strin
|
|||||||
|
|
||||||
func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) {
|
func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) {
|
||||||
installBase := "fuzz"
|
installBase := "fuzz"
|
||||||
if fuzzBin.fuzzType == fuzz.AFL {
|
|
||||||
installBase = "afl_fuzz"
|
|
||||||
}
|
|
||||||
|
|
||||||
fuzzBin.binaryDecorator.baseInstaller.dir = filepath.Join(
|
fuzzBin.binaryDecorator.baseInstaller.dir = filepath.Join(
|
||||||
installBase, ctx.Target().Arch.ArchType.String(), ctx.ModuleName())
|
installBase, ctx.Target().Arch.ArchType.String(), ctx.ModuleName())
|
||||||
@@ -333,12 +298,9 @@ func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFuzzer(hod android.HostOrDeviceSupported, fuzzType fuzz.FuzzType) *Module {
|
func NewFuzzer(hod android.HostOrDeviceSupported) *Module {
|
||||||
module, binary := newBinary(hod, false)
|
module, binary := newBinary(hod, false)
|
||||||
baseInstallerPath := "fuzz"
|
baseInstallerPath := "fuzz"
|
||||||
if fuzzType == fuzz.AFL {
|
|
||||||
baseInstallerPath = "afl_fuzz"
|
|
||||||
}
|
|
||||||
|
|
||||||
binary.baseInstaller = NewBaseInstaller(baseInstallerPath, baseInstallerPath, InstallInData)
|
binary.baseInstaller = NewBaseInstaller(baseInstallerPath, baseInstallerPath, InstallInData)
|
||||||
module.sanitize.SetSanitizer(Fuzzer, true)
|
module.sanitize.SetSanitizer(Fuzzer, true)
|
||||||
@@ -346,12 +308,13 @@ func NewFuzzer(hod android.HostOrDeviceSupported, fuzzType fuzz.FuzzType) *Modul
|
|||||||
fuzzBin := &fuzzBinary{
|
fuzzBin := &fuzzBinary{
|
||||||
binaryDecorator: binary,
|
binaryDecorator: binary,
|
||||||
baseCompiler: NewBaseCompiler(),
|
baseCompiler: NewBaseCompiler(),
|
||||||
fuzzType: fuzzType,
|
|
||||||
}
|
}
|
||||||
module.compiler = fuzzBin
|
module.compiler = fuzzBin
|
||||||
module.linker = fuzzBin
|
module.linker = fuzzBin
|
||||||
module.installer = fuzzBin
|
module.installer = fuzzBin
|
||||||
|
|
||||||
|
module.fuzzer.Properties.FuzzFramework = fuzz.LibFuzzer
|
||||||
|
|
||||||
// The fuzzer runtime is not present for darwin host modules, disable cc_fuzz modules when targeting darwin.
|
// The fuzzer runtime is not present for darwin host modules, disable cc_fuzz modules when targeting darwin.
|
||||||
android.AddLoadHook(module, func(ctx android.LoadHookContext) {
|
android.AddLoadHook(module, func(ctx android.LoadHookContext) {
|
||||||
disableDarwinAndLinuxBionic := struct {
|
disableDarwinAndLinuxBionic := struct {
|
||||||
@@ -367,19 +330,19 @@ func NewFuzzer(hod android.HostOrDeviceSupported, fuzzType fuzz.FuzzType) *Modul
|
|||||||
disableDarwinAndLinuxBionic.Target.Darwin.Enabled = BoolPtr(false)
|
disableDarwinAndLinuxBionic.Target.Darwin.Enabled = BoolPtr(false)
|
||||||
disableDarwinAndLinuxBionic.Target.Linux_bionic.Enabled = BoolPtr(false)
|
disableDarwinAndLinuxBionic.Target.Linux_bionic.Enabled = BoolPtr(false)
|
||||||
ctx.AppendProperties(&disableDarwinAndLinuxBionic)
|
ctx.AppendProperties(&disableDarwinAndLinuxBionic)
|
||||||
})
|
|
||||||
|
|
||||||
if fuzzType == fuzz.AFL {
|
targetFramework := fuzz.GetFramework(ctx, fuzz.Cc)
|
||||||
// Add cc_objects to Srcs
|
if !fuzz.IsValidFrameworkForModule(targetFramework, fuzz.Cc, fuzzBin.fuzzPackagedModule.FuzzProperties.Fuzzing_frameworks) {
|
||||||
fuzzBin.baseCompiler.Properties.Srcs = append(fuzzBin.baseCompiler.Properties.Srcs, ":aflpp_driver", ":afl-compiler-rt")
|
ctx.Module().Disable()
|
||||||
module.fuzzer.Properties.AFLEnabled = true
|
return
|
||||||
module.compiler.appendCflags([]string{
|
|
||||||
"-Wno-unused-result",
|
|
||||||
"-Wno-unused-parameter",
|
|
||||||
"-Wno-unused-function",
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if targetFramework == fuzz.AFL {
|
||||||
|
fuzzBin.baseCompiler.Properties.Srcs = append(fuzzBin.baseCompiler.Properties.Srcs, ":aflpp_driver", ":afl-compiler-rt")
|
||||||
|
module.fuzzer.Properties.FuzzFramework = fuzz.AFL
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return module
|
return module
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,17 +362,6 @@ func fuzzPackagingFactory() android.Singleton {
|
|||||||
fuzzTargetSharedDepsInstallPairs: "FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS",
|
fuzzTargetSharedDepsInstallPairs: "FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS",
|
||||||
allFuzzTargetsName: "ALL_FUZZ_TARGETS",
|
allFuzzTargetsName: "ALL_FUZZ_TARGETS",
|
||||||
}
|
}
|
||||||
fuzzPackager.FuzzType = fuzz.Cc
|
|
||||||
return fuzzPackager
|
|
||||||
}
|
|
||||||
|
|
||||||
func fuzzAFLPackagingFactory() android.Singleton {
|
|
||||||
fuzzPackager := &ccFuzzPackager{
|
|
||||||
fuzzPackagingArchModules: "SOONG_AFL_FUZZ_PACKAGING_ARCH_MODULES",
|
|
||||||
fuzzTargetSharedDepsInstallPairs: "AFL_FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS",
|
|
||||||
allFuzzTargetsName: "ALL_AFL_FUZZ_TARGETS",
|
|
||||||
}
|
|
||||||
fuzzPackager.FuzzType = fuzz.AFL
|
|
||||||
return fuzzPackager
|
return fuzzPackager
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +392,7 @@ func (s *ccFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) {
|
|||||||
|
|
||||||
sharedLibsInstallDirPrefix := "lib"
|
sharedLibsInstallDirPrefix := "lib"
|
||||||
fuzzModule, ok := ccModule.compiler.(*fuzzBinary)
|
fuzzModule, ok := ccModule.compiler.(*fuzzBinary)
|
||||||
if !ok || fuzzModule.fuzzType != s.FuzzType {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,9 +407,6 @@ func (s *ccFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
intermediatePath := "fuzz"
|
intermediatePath := "fuzz"
|
||||||
if s.FuzzType == fuzz.AFL {
|
|
||||||
intermediatePath = "afl_fuzz"
|
|
||||||
}
|
|
||||||
|
|
||||||
archString := ccModule.Arch().ArchType.String()
|
archString := ccModule.Arch().ArchType.String()
|
||||||
archDir := android.PathForIntermediates(ctx, intermediatePath, hostOrTargetString, archString)
|
archDir := android.PathForIntermediates(ctx, intermediatePath, hostOrTargetString, archString)
|
||||||
@@ -484,7 +433,7 @@ func (s *ccFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
s.CreateFuzzPackage(ctx, archDirs, s.FuzzType, pctx)
|
s.CreateFuzzPackage(ctx, archDirs, fuzz.Cc, pctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ccFuzzPackager) MakeVars(ctx android.MakeVarsContext) {
|
func (s *ccFuzzPackager) MakeVars(ctx android.MakeVarsContext) {
|
||||||
@@ -511,9 +460,6 @@ func GetSharedLibsToZip(sharedLibraries android.Paths, module LinkableInterface,
|
|||||||
var files []fuzz.FileToZip
|
var files []fuzz.FileToZip
|
||||||
|
|
||||||
fuzzDir := "fuzz"
|
fuzzDir := "fuzz"
|
||||||
if s.FuzzType == fuzz.AFL {
|
|
||||||
fuzzDir = "afl_fuzz"
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, library := range sharedLibraries {
|
for _, library := range sharedLibraries {
|
||||||
files = append(files, fuzz.FileToZip{library, destinationPathPrefix})
|
files = append(files, fuzz.FileToZip{library, destinationPathPrefix})
|
||||||
|
@@ -531,7 +531,6 @@ var PrepareForTestWithCcBuildComponents = android.GroupFixturePreparers(
|
|||||||
android.FixtureRegisterWithContext(RegisterRequiredBuildComponentsForTest),
|
android.FixtureRegisterWithContext(RegisterRequiredBuildComponentsForTest),
|
||||||
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
|
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
|
||||||
ctx.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
ctx.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
||||||
ctx.RegisterModuleType("cc_afl_fuzz", AFLFuzzFactory)
|
|
||||||
ctx.RegisterModuleType("cc_test", TestFactory)
|
ctx.RegisterModuleType("cc_test", TestFactory)
|
||||||
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
||||||
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||||
@@ -646,7 +645,6 @@ func CreateTestContext(config android.Config) *android.TestContext {
|
|||||||
ctx := android.NewTestArchContext(config)
|
ctx := android.NewTestArchContext(config)
|
||||||
genrule.RegisterGenruleBuildComponents(ctx)
|
genrule.RegisterGenruleBuildComponents(ctx)
|
||||||
ctx.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
ctx.RegisterModuleType("cc_fuzz", LibFuzzFactory)
|
||||||
ctx.RegisterModuleType("cc_afl_fuzz", AFLFuzzFactory)
|
|
||||||
ctx.RegisterModuleType("cc_test", TestFactory)
|
ctx.RegisterModuleType("cc_test", TestFactory)
|
||||||
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
||||||
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
||||||
|
@@ -27,13 +27,21 @@ import (
|
|||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FuzzType string
|
type Lang string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Cc FuzzType = ""
|
Cc Lang = "cc"
|
||||||
Rust FuzzType = "rust"
|
Rust Lang = "rust"
|
||||||
Java FuzzType = "java"
|
Java Lang = "java"
|
||||||
AFL FuzzType = "AFL"
|
)
|
||||||
|
|
||||||
|
type Framework string
|
||||||
|
|
||||||
|
const (
|
||||||
|
AFL Framework = "afl"
|
||||||
|
LibFuzzer Framework = "libfuzzer"
|
||||||
|
Jazzer Framework = "jazzer"
|
||||||
|
UnknownFramework Framework = "unknownframework"
|
||||||
)
|
)
|
||||||
|
|
||||||
var BoolDefault = proptools.BoolDefault
|
var BoolDefault = proptools.BoolDefault
|
||||||
@@ -48,7 +56,6 @@ type FuzzPackager struct {
|
|||||||
Packages android.Paths
|
Packages android.Paths
|
||||||
FuzzTargets map[string]bool
|
FuzzTargets map[string]bool
|
||||||
SharedLibInstallStrings []string
|
SharedLibInstallStrings []string
|
||||||
FuzzType FuzzType
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type FileToZip struct {
|
type FileToZip struct {
|
||||||
@@ -146,6 +153,12 @@ type FuzzConfig struct {
|
|||||||
IsJni *bool `json:"is_jni,omitempty"`
|
IsJni *bool `json:"is_jni,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FuzzFrameworks struct {
|
||||||
|
Afl *bool
|
||||||
|
Libfuzzer *bool
|
||||||
|
Jazzer *bool
|
||||||
|
}
|
||||||
|
|
||||||
type FuzzProperties struct {
|
type FuzzProperties struct {
|
||||||
// Optional list of seed files to be installed to the fuzz target's output
|
// Optional list of seed files to be installed to the fuzz target's output
|
||||||
// directory.
|
// directory.
|
||||||
@@ -155,6 +168,10 @@ type FuzzProperties struct {
|
|||||||
Data []string `android:"path"`
|
Data []string `android:"path"`
|
||||||
// Optional dictionary to be installed to the fuzz target's output directory.
|
// Optional dictionary to be installed to the fuzz target's output directory.
|
||||||
Dictionary *string `android:"path"`
|
Dictionary *string `android:"path"`
|
||||||
|
// Define the fuzzing frameworks this fuzz target can be built for. If
|
||||||
|
// empty then the fuzz target will be available to be built for all fuzz
|
||||||
|
// frameworks available
|
||||||
|
Fuzzing_frameworks *FuzzFrameworks
|
||||||
// Config for running the target on fuzzing infrastructure.
|
// Config for running the target on fuzzing infrastructure.
|
||||||
Fuzz_config *FuzzConfig
|
Fuzz_config *FuzzConfig
|
||||||
}
|
}
|
||||||
@@ -169,6 +186,49 @@ type FuzzPackagedModule struct {
|
|||||||
DataIntermediateDir android.Path
|
DataIntermediateDir android.Path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetFramework(ctx android.LoadHookContext, lang Lang) Framework {
|
||||||
|
framework := ctx.Config().Getenv("FUZZ_FRAMEWORK")
|
||||||
|
|
||||||
|
if lang == Cc {
|
||||||
|
switch strings.ToLower(framework) {
|
||||||
|
case "":
|
||||||
|
return LibFuzzer
|
||||||
|
case "libfuzzer":
|
||||||
|
return LibFuzzer
|
||||||
|
case "afl":
|
||||||
|
return AFL
|
||||||
|
}
|
||||||
|
} else if lang == Rust {
|
||||||
|
return LibFuzzer
|
||||||
|
} else if lang == Java {
|
||||||
|
return Jazzer
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.ModuleErrorf(fmt.Sprintf("%s is not a valid fuzzing framework for %s", framework, lang))
|
||||||
|
return UnknownFramework
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsValidFrameworkForModule(targetFramework Framework, lang Lang, moduleFrameworks *FuzzFrameworks) bool {
|
||||||
|
if targetFramework == UnknownFramework {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if moduleFrameworks == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
switch targetFramework {
|
||||||
|
case LibFuzzer:
|
||||||
|
return proptools.BoolDefault(moduleFrameworks.Libfuzzer, true)
|
||||||
|
case AFL:
|
||||||
|
return proptools.BoolDefault(moduleFrameworks.Afl, true)
|
||||||
|
case Jazzer:
|
||||||
|
return proptools.BoolDefault(moduleFrameworks.Jazzer, true)
|
||||||
|
default:
|
||||||
|
panic("%s is not supported as a fuzz framework")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func IsValid(fuzzModule FuzzModule) bool {
|
func IsValid(fuzzModule FuzzModule) bool {
|
||||||
// Discard ramdisk + vendor_ramdisk + recovery modules, they're duplicates of
|
// Discard ramdisk + vendor_ramdisk + recovery modules, they're duplicates of
|
||||||
// fuzz targets we're going to package anyway.
|
// fuzz targets we're going to package anyway.
|
||||||
@@ -267,7 +327,7 @@ func (f *FuzzConfig) String() string {
|
|||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *FuzzPackager) CreateFuzzPackage(ctx android.SingletonContext, archDirs map[ArchOs][]FileToZip, fuzzType FuzzType, pctx android.PackageContext) {
|
func (s *FuzzPackager) CreateFuzzPackage(ctx android.SingletonContext, archDirs map[ArchOs][]FileToZip, fuzzType Lang, pctx android.PackageContext) {
|
||||||
var archOsList []ArchOs
|
var archOsList []ArchOs
|
||||||
for archOs := range archDirs {
|
for archOs := range archDirs {
|
||||||
archOsList = append(archOsList, archOs)
|
archOsList = append(archOsList, archOs)
|
||||||
@@ -286,9 +346,7 @@ func (s *FuzzPackager) CreateFuzzPackage(ctx android.SingletonContext, archDirs
|
|||||||
if fuzzType == Java {
|
if fuzzType == Java {
|
||||||
zipFileName = "fuzz-java-" + hostOrTarget + "-" + arch + ".zip"
|
zipFileName = "fuzz-java-" + hostOrTarget + "-" + arch + ".zip"
|
||||||
}
|
}
|
||||||
if fuzzType == AFL {
|
|
||||||
zipFileName = "fuzz-afl-" + hostOrTarget + "-" + arch + ".zip"
|
|
||||||
}
|
|
||||||
outputFile := android.PathForOutput(ctx, zipFileName)
|
outputFile := android.PathForOutput(ctx, zipFileName)
|
||||||
|
|
||||||
s.Packages = append(s.Packages, outputFile)
|
s.Packages = append(s.Packages, outputFile)
|
||||||
|
Reference in New Issue
Block a user