aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-09-14 19:25:01 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-09-15 16:02:37 +0200
commit52a33fd516102a98d3753bf69417235b655a68dc (patch)
tree351ab73db934d3b4e4babbe27e8801c659f2631b /tools
parent25f4fe0662f7f3b390d16b2e786f2ba0aa0293f1 (diff)
prog: remove default target and all global state
Now each prog function accepts the desired target explicitly. No global, implicit state involved. This is much cleaner and allows cross-OS/arch testing, etc.
Diffstat (limited to 'tools')
-rw-r--r--tools/syz-crush/crush.go2
-rw-r--r--tools/syz-execprog/execprog.go5
-rw-r--r--tools/syz-mutate/mutate.go9
-rw-r--r--tools/syz-prog2c/prog2c.go6
-rw-r--r--tools/syz-repro/repro.go2
-rw-r--r--tools/syz-stress/stress.go27
-rw-r--r--tools/syz-upgrade/upgrade.go7
7 files changed, 34 insertions, 24 deletions
diff --git a/tools/syz-crush/crush.go b/tools/syz-crush/crush.go
index 059852200..6deeeffd8 100644
--- a/tools/syz-crush/crush.go
+++ b/tools/syz-crush/crush.go
@@ -37,7 +37,7 @@ func main() {
if len(flag.Args()) != 1 {
Fatalf("usage: syz-crush -config=config.file execution.log")
}
- if err := prog.SetDefaultTarget(cfg.TargetOS, cfg.TargetArch); err != nil {
+ if _, err := prog.GetTarget(cfg.TargetOS, cfg.TargetArch); err != nil {
Fatalf("%v", err)
}
env := mgrconfig.CreateVMEnv(cfg, false)
diff --git a/tools/syz-execprog/execprog.go b/tools/syz-execprog/execprog.go
index 53fcbb8ca..282e416e3 100644
--- a/tools/syz-execprog/execprog.go
+++ b/tools/syz-execprog/execprog.go
@@ -47,7 +47,8 @@ func main() {
os.Exit(1)
}
- if err := prog.SetDefaultTarget(runtime.GOOS, *flagArch); err != nil {
+ target, err := prog.GetTarget(runtime.GOOS, *flagArch)
+ if err != nil {
Fatalf("%v", err)
}
@@ -57,7 +58,7 @@ func main() {
if err != nil {
Fatalf("failed to read log file: %v", err)
}
- entries := prog.ParseLog(data)
+ entries := target.ParseLog(data)
for _, ent := range entries {
progs = append(progs, ent.P)
}
diff --git a/tools/syz-mutate/mutate.go b/tools/syz-mutate/mutate.go
index 1c15eabc5..242175ef8 100644
--- a/tools/syz-mutate/mutate.go
+++ b/tools/syz-mutate/mutate.go
@@ -27,7 +27,8 @@ func main() {
fmt.Fprintf(os.Stderr, "usage: mutate program\n")
os.Exit(1)
}
- if err := prog.SetDefaultTarget(runtime.GOOS, runtime.GOARCH); err != nil {
+ target, err := prog.GetTarget(runtime.GOOS, runtime.GOARCH)
+ if err != nil {
fmt.Fprintf(os.Stderr, "%v", err)
os.Exit(1)
}
@@ -36,14 +37,14 @@ func main() {
fmt.Fprintf(os.Stderr, "failed to read prog file: %v\n", err)
os.Exit(1)
}
- p, err := prog.Deserialize(data)
+ p, err := target.Deserialize(data)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to deserialize the program: %v\n", err)
os.Exit(1)
}
- prios := prog.CalculatePriorities(nil)
- ct := prog.BuildChoiceTable(prios, nil)
+ prios := target.CalculatePriorities(nil)
+ ct := target.BuildChoiceTable(prios, nil)
seed := time.Now().UnixNano()
if *flagSeed != -1 {
diff --git a/tools/syz-prog2c/prog2c.go b/tools/syz-prog2c/prog2c.go
index bc6453875..f0ab63f36 100644
--- a/tools/syz-prog2c/prog2c.go
+++ b/tools/syz-prog2c/prog2c.go
@@ -15,6 +15,7 @@ import (
)
var (
+ flagArch = flag.String("arch", runtime.GOARCH, "target arch")
flagThreaded = flag.Bool("threaded", false, "create threaded program")
flagCollide = flag.Bool("collide", false, "create collide program")
flagRepeat = flag.Bool("repeat", false, "repeat program infinitely or not")
@@ -36,7 +37,8 @@ func main() {
flag.PrintDefaults()
os.Exit(1)
}
- if err := prog.SetDefaultTarget(runtime.GOOS, runtime.GOARCH); err != nil {
+ target, err := prog.GetTarget(runtime.GOOS, *flagArch)
+ if err != nil {
fmt.Fprintf(os.Stderr, "%v", err)
os.Exit(1)
}
@@ -45,7 +47,7 @@ func main() {
fmt.Fprintf(os.Stderr, "failed to read prog file: %v\n", err)
os.Exit(1)
}
- p, err := prog.Deserialize(data)
+ p, err := target.Deserialize(data)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to deserialize the program: %v\n", err)
os.Exit(1)
diff --git a/tools/syz-repro/repro.go b/tools/syz-repro/repro.go
index 310ea54a9..6d8316866 100644
--- a/tools/syz-repro/repro.go
+++ b/tools/syz-repro/repro.go
@@ -38,7 +38,7 @@ func main() {
if err != nil {
Fatalf("failed to open log file: %v", err)
}
- if err := prog.SetDefaultTarget(cfg.TargetOS, cfg.TargetArch); err != nil {
+ if _, err := prog.GetTarget(cfg.TargetOS, cfg.TargetArch); err != nil {
Fatalf("%v", err)
}
env := mgrconfig.CreateVMEnv(cfg, false)
diff --git a/tools/syz-stress/stress.go b/tools/syz-stress/stress.go
index 6e24f3915..77be42299 100644
--- a/tools/syz-stress/stress.go
+++ b/tools/syz-stress/stress.go
@@ -37,18 +37,19 @@ const programLength = 30
func main() {
flag.Parse()
- if err := prog.SetDefaultTarget(runtime.GOOS, runtime.GOARCH); err != nil {
+ target, err := prog.GetTarget(runtime.GOOS, runtime.GOARCH)
+ if err != nil {
Fatalf("%v", err)
}
- corpus := readCorpus()
+ corpus := readCorpus(target)
Logf(0, "parsed %v programs", len(corpus))
if !*flagGenerate && len(corpus) == 0 {
Fatalf("nothing to mutate (-generate=false and no corpus)")
}
- calls := buildCallList()
- prios := prog.CalculatePriorities(corpus)
- ct := prog.BuildChoiceTable(prios, calls)
+ calls := buildCallList(target)
+ prios := target.CalculatePriorities(corpus)
+ ct := target.BuildChoiceTable(prios, calls)
config, err := ipc.DefaultConfig()
if err != nil {
@@ -67,7 +68,7 @@ func main() {
for i := 0; ; i++ {
var p *prog.Prog
if *flagGenerate && len(corpus) == 0 || i%4 != 0 {
- p = prog.Generate(rs, programLength, ct)
+ p = target.Generate(rs, programLength, ct)
execute(pid, env, p)
p.Mutate(rs, programLength, ct, corpus)
execute(pid, env, p)
@@ -113,7 +114,7 @@ func execute(pid int, env *ipc.Env, p *prog.Prog) {
}
}
-func readCorpus() []*prog.Prog {
+func readCorpus(target *prog.Target) []*prog.Prog {
if *flagCorpus == "" {
return nil
}
@@ -123,7 +124,7 @@ func readCorpus() []*prog.Prog {
}
var progs []*prog.Prog
for _, rec := range db.Records {
- p, err := prog.Deserialize(rec.Val)
+ p, err := target.Deserialize(rec.Val)
if err != nil {
Fatalf("failed to deserialize corpus program: %v", err)
}
@@ -132,21 +133,21 @@ func readCorpus() []*prog.Prog {
return progs
}
-func buildCallList() map[*prog.Syscall]bool {
- calls, err := host.DetectSupportedSyscalls()
+func buildCallList(target *prog.Target) map[*prog.Syscall]bool {
+ calls, err := host.DetectSupportedSyscalls(target)
if err != nil {
Logf(0, "failed to detect host supported syscalls: %v", err)
calls = make(map[*prog.Syscall]bool)
- for _, c := range prog.Syscalls {
+ for _, c := range target.Syscalls {
calls[c] = true
}
}
- for _, c := range prog.Syscalls {
+ for _, c := range target.Syscalls {
if !calls[c] {
Logf(0, "disabling unsupported syscall: %v", c.Name)
}
}
- trans := prog.TransitivelyEnabledCalls(calls)
+ trans := target.TransitivelyEnabledCalls(calls)
for c := range calls {
if !trans[c] {
Logf(0, "disabling transitively unsupported syscall: %v", c.Name)
diff --git a/tools/syz-upgrade/upgrade.go b/tools/syz-upgrade/upgrade.go
index 0a28a27fb..d833fdc21 100644
--- a/tools/syz-upgrade/upgrade.go
+++ b/tools/syz-upgrade/upgrade.go
@@ -15,6 +15,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
+ "runtime"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/prog"
@@ -29,13 +30,17 @@ func main() {
if err != nil {
fatalf("failed to read corpus dir: %v", err)
}
+ target, err := prog.GetTarget(runtime.GOOS, runtime.GOARCH)
+ if err != nil {
+ fatalf("%v", err)
+ }
for _, f := range files {
fname := filepath.Join(os.Args[1], f.Name())
data, err := ioutil.ReadFile(fname)
if err != nil {
fatalf("failed to read program: %v", err)
}
- p, err := prog.Deserialize(data)
+ p, err := target.Deserialize(data)
if err != nil {
fatalf("failed to deserialize program: %v", err)
}