diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-12-10 15:10:33 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-12-10 16:37:02 +0100 |
| commit | c7ba317e9bfa7672d851df1217c2c3ea045c55f1 (patch) | |
| tree | 8ccc14054d803776a152a4603c7bfff6576e382b | |
| parent | 593b260b0233013ce7bbd5acf39263ab83244a14 (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.go | 13 | ||||
| -rw-r--r-- | tools/syz-runtest/runtest.go | 23 |
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 +} |
