From dfd609eca1871f01757d6b04b19fc273c87c14e5 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Tue, 5 Feb 2019 16:19:34 +0100 Subject: execprog, stress, prog2c: unify flags to enable additional features This change makes all syz-execprog, syz-prog2c and syz-stress accept -enable and -disable flags to enable or disable additional features (tun, net_dev, net_reset, cgroups and binfmt_misc) instead of having a separate flag for each of them. The default (without any flags) behavior isn't changed: syz-execprog and syz-stress enabled all the features (provided the runtime supports them) and syz-prog2c disables all of them. --- tools/syz-execprog/execprog.go | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'tools/syz-execprog/execprog.go') diff --git a/tools/syz-execprog/execprog.go b/tools/syz-execprog/execprog.go index f65ad9d9b..bfc50beaf 100644 --- a/tools/syz-execprog/execprog.go +++ b/tools/syz-execprog/execprog.go @@ -16,6 +16,7 @@ import ( "time" "github.com/google/syzkaller/pkg/cover" + "github.com/google/syzkaller/pkg/csource" "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/ipc" "github.com/google/syzkaller/pkg/ipc/ipcconfig" @@ -32,29 +33,37 @@ var ( flagRepeat = flag.Int("repeat", 1, "repeat execution that many times (0 for infinite loop)") flagProcs = flag.Int("procs", 1, "number of parallel processes to execute programs") flagOutput = flag.Bool("output", false, "write programs and results to stdout") + flagHints = flag.Bool("hints", false, "do a hints-generation run") flagFaultCall = flag.Int("fault_call", -1, "inject fault into this call (0-based)") flagFaultNth = flag.Int("fault_nth", 0, "inject fault on n-th operation (0-based)") - flagHints = flag.Bool("hints", false, "do a hints-generation run") + flagEnable = flag.String("enable", "none", "enable only listed additional features") + flagDisable = flag.String("disable", "none", "enable all additional features except listed") ) func main() { - flag.Parse() - if len(flag.Args()) == 0 { + flag.Usage = func() { fmt.Fprintf(os.Stderr, "usage: execprog [flags] file-with-programs+\n") flag.PrintDefaults() + csource.PrintAvailableFeaturesFlags() + } + flag.Parse() + if len(flag.Args()) == 0 { + flag.Usage() os.Exit(1) } + featuresFlags, err := csource.ParseFeaturesFlags(*flagEnable, *flagDisable, true) + if err != nil { + log.Fatalf("%v", err) + } target, err := prog.GetTarget(*flagOS, *flagArch) if err != nil { log.Fatalf("%v", err) } - entries := loadPrograms(target, flag.Args()) if len(entries) == 0 { return } - features, err := host.Check(target) if err != nil { log.Fatalf("%v", err) @@ -67,7 +76,7 @@ func main() { if _, err = host.Setup(target, features); err != nil { log.Fatalf("%v", err) } - config, execOpts := createConfig(target, entries, features) + config, execOpts := createConfig(target, entries, features, featuresFlags) ctx := &Context{ entries: entries, @@ -264,7 +273,8 @@ func loadPrograms(target *prog.Target, files []string) []*prog.LogEntry { return entries } -func createConfig(target *prog.Target, entries []*prog.LogEntry, features *host.Features) ( +func createConfig(target *prog.Target, entries []*prog.LogEntry, + features *host.Features, featuresFlags csource.Features) ( *ipc.Config, *ipc.ExecOpts) { config, execOpts, err := ipcconfig.Default(target) if err != nil { @@ -299,11 +309,20 @@ func createConfig(target *prog.Target, entries []*prog.LogEntry, features *host. handled[call.Meta.CallName] = true } } - if features[host.FeatureNetworkInjection].Enabled { + if featuresFlags["tun"].Enabled && features[host.FeatureNetworkInjection].Enabled { config.Flags |= ipc.FlagEnableTun } - if features[host.FeatureNetworkDevices].Enabled { + if featuresFlags["net_dev"].Enabled && features[host.FeatureNetworkDevices].Enabled { config.Flags |= ipc.FlagEnableNetDev } + if featuresFlags["net_reset"].Enabled { + config.Flags |= ipc.FlagEnableNetReset + } + if featuresFlags["cgroups"].Enabled { + config.Flags |= ipc.FlagEnableCgroups + } + if featuresFlags["binfmt_misc"].Enabled { + config.Flags |= ipc.FlagEnableBinfmtMisc + } return config, execOpts } -- cgit mrf-deployment