diff options
| author | Andrey Konovalov <andreyknvl@google.com> | 2019-02-05 16:19:34 +0100 |
|---|---|---|
| committer | Andrey Konovalov <andreyknvl@gmail.com> | 2019-03-05 14:30:10 +0100 |
| commit | dfd609eca1871f01757d6b04b19fc273c87c14e5 (patch) | |
| tree | bd16e4561775f52e40f970a35a032f1f390171a9 /tools | |
| parent | c55829aef16e95df564cb23e700e5de8490229a0 (diff) | |
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.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/syz-execprog/execprog.go | 37 | ||||
| -rw-r--r-- | tools/syz-prog2c/prog2c.go | 54 | ||||
| -rw-r--r-- | tools/syz-stress/stress.go | 28 |
3 files changed, 83 insertions, 36 deletions
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 } diff --git a/tools/syz-prog2c/prog2c.go b/tools/syz-prog2c/prog2c.go index d45c1e5a8..d076ad2ee 100644 --- a/tools/syz-prog2c/prog2c.go +++ b/tools/syz-prog2c/prog2c.go @@ -7,6 +7,7 @@ import ( "flag" "fmt" "io/ioutil" + "log" "os" "runtime" @@ -27,22 +28,28 @@ var ( flagProg = flag.String("prog", "", "file with program to convert (required)") 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)") - flagEnableTun = flag.Bool("tun", false, "set up TUN/TAP interface") - flagUseTmpDir = flag.Bool("tmpdir", false, "create a temporary dir and execute inside it") - flagCgroups = flag.Bool("cgroups", false, "enable cgroups support") - flagNetdev = flag.Bool("netdev", false, "setup various net devices") - flagResetNet = flag.Bool("resetnet", false, "reset net namespace after each test") flagHandleSegv = flag.Bool("segv", false, "catch and ignore SIGSEGV") + flagUseTmpDir = flag.Bool("tmpdir", false, "create a temporary dir and execute inside it") flagTrace = flag.Bool("trace", false, "trace syscall results") flagStrict = flag.Bool("strict", false, "parse input program in strict mode") + flagEnable = flag.String("enable", "none", "enable only listed additional features") + flagDisable = flag.String("disable", "none", "enable all additional features except listed") ) func main() { + flag.Usage = func() { + flag.PrintDefaults() + csource.PrintAvailableFeaturesFlags() + } flag.Parse() if *flagProg == "" { - flag.PrintDefaults() + flag.Usage() os.Exit(1) } + features, err := csource.ParseFeaturesFlags(*flagEnable, *flagDisable, false) + if err != nil { + log.Fatalf("%v", err) + } target, err := prog.GetTarget(*flagOS, *flagArch) if err != nil { fmt.Fprintf(os.Stderr, "%v", err) @@ -63,23 +70,24 @@ func main() { os.Exit(1) } opts := csource.Options{ - Threaded: *flagThreaded, - Collide: *flagCollide, - Repeat: *flagRepeat != 1, - RepeatTimes: *flagRepeat, - Procs: *flagProcs, - Sandbox: *flagSandbox, - Fault: *flagFaultCall >= 0, - FaultCall: *flagFaultCall, - FaultNth: *flagFaultNth, - EnableTun: *flagEnableTun, - UseTmpDir: *flagUseTmpDir, - EnableCgroups: *flagCgroups, - EnableNetdev: *flagNetdev, - ResetNet: *flagResetNet, - HandleSegv: *flagHandleSegv, - Repro: false, - Trace: *flagTrace, + Threaded: *flagThreaded, + Collide: *flagCollide, + Repeat: *flagRepeat != 1, + RepeatTimes: *flagRepeat, + Procs: *flagProcs, + Sandbox: *flagSandbox, + Fault: *flagFaultCall >= 0, + FaultCall: *flagFaultCall, + FaultNth: *flagFaultNth, + EnableTun: features["tun"].Enabled, + EnableNetDev: features["net_dev"].Enabled, + EnableNetReset: features["net_reset"].Enabled, + EnableCgroups: features["cgroups"].Enabled, + EnableBinfmtMisc: features["binfmt_misc"].Enabled, + UseTmpDir: *flagUseTmpDir, + HandleSegv: *flagHandleSegv, + Repro: false, + Trace: *flagTrace, } src, err := csource.Write(p, opts) if err != nil { diff --git a/tools/syz-stress/stress.go b/tools/syz-stress/stress.go index c56936377..e287b4468 100644 --- a/tools/syz-stress/stress.go +++ b/tools/syz-stress/stress.go @@ -14,6 +14,7 @@ import ( "sync/atomic" "time" + "github.com/google/syzkaller/pkg/csource" "github.com/google/syzkaller/pkg/db" "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/ipc" @@ -32,7 +33,9 @@ var ( flagProcs = flag.Int("procs", 2*runtime.NumCPU(), "number of parallel processes") flagLogProg = flag.Bool("logprog", false, "print programs before execution") flagGenerate = flag.Bool("generate", true, "generate new programs, otherwise only mutate corpus") - flagEnable = flag.String("enable", "", "comma-separated list of enabled syscalls") + flagSyscalls = flag.String("syscalls", "", "comma-separated list of enabled syscalls") + flagEnable = flag.String("enable", "none", "enable only listed additional features") + flagDisable = flag.String("disable", "none", "enable all additional features except listed") statExec uint64 gate *ipc.Gate @@ -41,7 +44,15 @@ var ( const programLength = 30 func main() { + flag.Usage = func() { + flag.PrintDefaults() + csource.PrintAvailableFeaturesFlags() + } flag.Parse() + 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) @@ -60,7 +71,7 @@ func main() { log.Fatalf("%v", err) } - calls := buildCallList(target, strings.Split(*flagEnable, ",")) + calls := buildCallList(target, strings.Split(*flagSyscalls, ",")) prios := target.CalculatePriorities(corpus) ct := target.BuildChoiceTable(prios, calls) @@ -68,12 +79,21 @@ func main() { if err != nil { log.Fatalf("%v", err) } - 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 + } gate = ipc.NewGate(2**flagProcs, nil) for pid := 0; pid < *flagProcs; pid++ { pid := pid |
