aboutsummaryrefslogtreecommitdiffstats
path: root/tools/syz-mutate
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-02-17 17:31:53 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-02-17 19:02:12 +0100
commit1f693e021993b9ce686952f9f28475684767c458 (patch)
tree1eea325050a27bd21a86215a7a762475226cba48 /tools/syz-mutate
parent4f4f70406cad6adf80c2bf8fb5b6b9049f2984d0 (diff)
tools/syz-mutate: allow limiting set of syscalls
Diffstat (limited to 'tools/syz-mutate')
-rw-r--r--tools/syz-mutate/mutate.go35
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())
}