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.
This commit is contained in:
Dmitry Vyukov 2018-12-10 15:10:33 +01:00
parent 593b260b02
commit c7ba317e9b
2 changed files with 33 additions and 3 deletions

View File

@ -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)
}

View File

@ -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
}