aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-12-10 15:10:33 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-12-10 16:37:02 +0100
commitc7ba317e9bfa7672d851df1217c2c3ea045c55f1 (patch)
tree8ccc14054d803776a152a4603c7bfff6576e382b
parent593b260b0233013ce7bbd5acf39263ab83244a14 (diff)
tools/syz-runtest: test program parsing before booting VMs
It sucks to wait for VMs to boot just to discover that programs don't parse.
-rw-r--r--pkg/runtest/run.go13
-rw-r--r--tools/syz-runtest/runtest.go23
2 files changed, 33 insertions, 3 deletions
diff --git a/pkg/runtest/run.go b/pkg/runtest/run.go
index d6543e0b8..bec1d7667 100644
--- a/pkg/runtest/run.go
+++ b/pkg/runtest/run.go
@@ -208,11 +208,20 @@ func (ctx *Context) generatePrograms(progs chan *RunRequest) error {
}
func (ctx *Context) parseProg(filename string) (*prog.Prog, map[string]bool, *ipc.ProgInfo, error) {
- data, err := ioutil.ReadFile(filepath.Join(ctx.Dir, filename))
+ return parseProg(ctx.Target, ctx.Dir, filename)
+}
+
+func TestParseProg(target *prog.Target, dir, filename string) error {
+ _, _, _, err := parseProg(target, dir, filename)
+ return err
+}
+
+func parseProg(target *prog.Target, dir, filename string) (*prog.Prog, map[string]bool, *ipc.ProgInfo, error) {
+ data, err := ioutil.ReadFile(filepath.Join(dir, filename))
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to read %v: %v", filename, err)
}
- p, err := ctx.Target.Deserialize(data, prog.Strict)
+ p, err := target.Deserialize(data, prog.Strict)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to deserialize %v: %v", filename, err)
}
diff --git a/tools/syz-runtest/runtest.go b/tools/syz-runtest/runtest.go
index c1a1525d2..a84bc005d 100644
--- a/tools/syz-runtest/runtest.go
+++ b/tools/syz-runtest/runtest.go
@@ -15,6 +15,7 @@ import (
"net"
"os"
"path/filepath"
+ "strings"
"sync"
"time"
@@ -44,6 +45,10 @@ func main() {
if err != nil {
log.Fatal(err)
}
+ testDir := filepath.Join(cfg.Syzkaller, "sys", target.OS, "test")
+ if err := testParsing(target, testDir); err != nil {
+ log.Fatal(err)
+ }
vmPool, err := vm.Create(cfg, *flagDebug)
if err != nil {
log.Fatal(err)
@@ -111,7 +116,7 @@ func main() {
fmt.Printf("%-24v: %v calls enabled\n", sandbox+" sandbox", len(calls))
}
ctx := &runtest.Context{
- Dir: filepath.Join(cfg.Syzkaller, "sys", target.OS, "test"),
+ Dir: testDir,
Target: target,
Features: mgr.checkResult.Features,
EnabledCalls: enabledCalls,
@@ -268,3 +273,19 @@ func (mgr *Manager) Done(a *rpctype.RunTestDoneArgs, r *int) error {
close(req.Done)
return nil
}
+
+func testParsing(target *prog.Target, dir string) error {
+ files, err := ioutil.ReadDir(dir)
+ if err != nil {
+ return fmt.Errorf("failed to read %v: %v", dir, err)
+ }
+ for _, file := range files {
+ if strings.HasSuffix(file.Name(), "~") {
+ continue
+ }
+ if err := runtest.TestParseProg(target, dir, file.Name()); err != nil {
+ return err
+ }
+ }
+ return nil
+}