diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-02-17 17:31:53 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-02-17 19:02:12 +0100 |
| commit | 1f693e021993b9ce686952f9f28475684767c458 (patch) | |
| tree | 1eea325050a27bd21a86215a7a762475226cba48 /tools/syz-mutate | |
| parent | 4f4f70406cad6adf80c2bf8fb5b6b9049f2984d0 (diff) | |
tools/syz-mutate: allow limiting set of syscalls
Diffstat (limited to 'tools/syz-mutate')
| -rw-r--r-- | tools/syz-mutate/mutate.go | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/tools/syz-mutate/mutate.go b/tools/syz-mutate/mutate.go index 3515a663e..4cf3401bc 100644 --- a/tools/syz-mutate/mutate.go +++ b/tools/syz-mutate/mutate.go @@ -11,16 +11,20 @@ import ( "math/rand" "os" "runtime" + "strings" "time" "github.com/google/syzkaller/prog" _ "github.com/google/syzkaller/sys" + "github.com/google/syzkaller/syz-manager/mgrconfig" ) var ( - flagOS = flag.String("os", runtime.GOOS, "target os") - flagArch = flag.String("arch", runtime.GOARCH, "target arch") - flagSeed = flag.Int("seed", -1, "prng seed") + flagOS = flag.String("os", runtime.GOOS, "target os") + flagArch = flag.String("arch", runtime.GOARCH, "target arch") + flagSeed = flag.Int("seed", -1, "prng seed") + flagLen = flag.Int("len", 30, "number of calls in programs") + flagEnable = flag.String("enable", "", "comma-separated list of enabled syscalls") ) func main() { @@ -30,16 +34,35 @@ func main() { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } + var syscalls map[*prog.Syscall]bool + if *flagEnable != "" { + syscallsIDs, err := mgrconfig.ParseEnabledSyscalls(target, strings.Split(*flagEnable, ","), nil) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to parse enabled syscalls: %v", err) + os.Exit(1) + } + syscalls = make(map[*prog.Syscall]bool) + for id := range syscallsIDs { + syscalls[target.Syscalls[id]] = true + } + trans := target.TransitivelyEnabledCalls(syscalls) + for c := range syscalls { + if !trans[c] { + fmt.Fprintf(os.Stderr, "disabling %v\n", c.Name) + delete(syscalls, c) + } + } + } seed := time.Now().UnixNano() if *flagSeed != -1 { seed = int64(*flagSeed) } rs := rand.NewSource(seed) prios := target.CalculatePriorities(nil) - ct := target.BuildChoiceTable(prios, nil) + ct := target.BuildChoiceTable(prios, syscalls) var p *prog.Prog if flag.NArg() == 0 { - p = target.Generate(rs, 20, ct) + p = target.Generate(rs, *flagLen, ct) } else { data, err := ioutil.ReadFile(flag.Arg(0)) if err != nil { @@ -51,7 +74,7 @@ func main() { fmt.Fprintf(os.Stderr, "failed to deserialize the program: %v\n", err) os.Exit(1) } - p.Mutate(rs, len(p.Calls)+10, ct, nil) + p.Mutate(rs, *flagLen, ct, nil) } fmt.Printf("%s\n", p.Serialize()) } |
