aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2019-02-05 16:19:34 +0100
committerAndrey Konovalov <andreyknvl@gmail.com>2019-03-05 14:30:10 +0100
commitdfd609eca1871f01757d6b04b19fc273c87c14e5 (patch)
treebd16e4561775f52e40f970a35a032f1f390171a9 /tools
parentc55829aef16e95df564cb23e700e5de8490229a0 (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.go37
-rw-r--r--tools/syz-prog2c/prog2c.go54
-rw-r--r--tools/syz-stress/stress.go28
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