diff options
| -rwxr-xr-x | syz-verifier/main.go | 27 | ||||
| -rw-r--r-- | syz-verifier/main_test.go | 31 |
2 files changed, 26 insertions, 32 deletions
diff --git a/syz-verifier/main.go b/syz-verifier/main.go index b1eff4e78..ee2dcbbce 100755 --- a/syz-verifier/main.go +++ b/syz-verifier/main.go @@ -81,7 +81,7 @@ type poolInfo struct { Reporter report.Reporter // vmRunners keeps track of what programs have been sent to each Runner. // There is one Runner executing per VM instance. - vmRunners map[int][]*progInfo + vmRunners map[int]runnerProgs // progs stores the programs that haven't been sent to this kernel yet but // have been sent to at least one other kernel. progs []*progInfo @@ -95,11 +95,10 @@ type progInfo struct { idx int serialized []byte res []*Result - - // done is set to true if the program was already verified. - done bool } +type runnerProgs map[int]*progInfo + func main() { var cfgs tool.CfgsFlag flag.Var(&cfgs, "configs", "list of kernel-specific comma-sepatated configuration files ") @@ -186,8 +185,7 @@ func main() { if err != nil { log.Fatalf("failed to create reporter for instance-%d: %v", idx, err) } - pi.vmRunners = make(map[int][]*progInfo) - pi.progs = make([]*progInfo, 0) + pi.vmRunners = make(map[int]runnerProgs) } calls := make(map[*prog.Syscall]bool) @@ -230,7 +228,6 @@ func (vrf *Verifier) startInstances() { if err != nil { log.Fatalf("failed to create instance: %v", err) } - fwdAddr, err := inst.Forward(vrf.srv.port) if err != nil { log.Fatalf("failed to set up port forwarding: %v", err) @@ -286,7 +283,7 @@ func (srv *RPCServer) Connect(a *rpctype.RunnerConnectArgs, r *rpctype.RunnerCon srv.mu.Lock() defer srv.mu.Unlock() pool, vm := a.Pool, a.VM - srv.pools[pool].vmRunners[vm] = nil + srv.pools[pool].vmRunners[vm] = make(runnerProgs) r.CheckUnsupportedCalls = !srv.pools[pool].checked return nil } @@ -383,9 +380,10 @@ func (srv *RPCServer) NextExchange(a *rpctype.NextExchangeArgs, r *rpctype.NextE return nil } - if prog.done = srv.newResult(res, prog); prog.done { + if srv.newResult(res, prog) { srv.vrf.processResults(prog.res, prog.prog) delete(srv.progs, a.ProgIdx) + delete(srv.pools[a.Pool].vmRunners[a.VM], a.ProgIdx) } } @@ -492,7 +490,7 @@ func (srv *RPCServer) newProgram(poolIdx, vmIdx int) ([]byte, int) { srv.progs[progIdx] = pi } p := pool.progs[0] - pool.vmRunners[vmIdx] = append(pool.vmRunners[vmIdx], p) + pool.vmRunners[vmIdx][p.idx] = p pool.progs = pool.progs[1:] return p.serialized, p.idx } @@ -508,15 +506,12 @@ func (srv *RPCServer) cleanup(poolIdx, vmIdx int) { srv.mu.Lock() defer srv.mu.Unlock() progs := srv.pools[poolIdx].vmRunners[vmIdx] - delete(srv.pools[poolIdx].vmRunners, vmIdx) - for _, prog := range progs { - if prog.done { - continue - } - if prog.done = srv.newResult(&Result{Pool: poolIdx, Crashed: true}, prog); prog.done { + for _, prog := range progs { + if srv.newResult(&Result{Pool: poolIdx, Crashed: true}, prog) { srv.vrf.processResults(prog.res, prog.prog) delete(srv.progs, prog.idx) + delete(srv.pools[poolIdx].vmRunners[vmIdx], prog.idx) continue } } diff --git a/syz-verifier/main_test.go b/syz-verifier/main_test.go index 81042b6b3..197178bba 100644 --- a/syz-verifier/main_test.go +++ b/syz-verifier/main_test.go @@ -40,13 +40,13 @@ func TestNewProgram(t *testing.T) { srv := createTestServer(t) srv.pools = map[int]*poolInfo{ 1: { - vmRunners: map[int][]*progInfo{ - 0: {{idx: 1}}, + vmRunners: map[int]runnerProgs{ + 1: {1: {}}, }, progs: []*progInfo{{idx: 3}}, }, - 2: {vmRunners: map[int][]*progInfo{ - 2: {{idx: 1}}}, + 2: {vmRunners: map[int]runnerProgs{ + 2: {1: {}}}, progs: []*progInfo{}, }, } @@ -108,9 +108,8 @@ func TestConnect(t *testing.T) { srv := createTestServer(t) srv.pools = map[int]*poolInfo{ 1: { - vmRunners: map[int][]*progInfo{ - 0: {{ - idx: 1}}, + vmRunners: map[int]runnerProgs{ + 0: {1: {idx: 1}}, }, progs: []*progInfo{{ idx: 3}}, @@ -126,9 +125,9 @@ func TestConnect(t *testing.T) { if diff := cmp.Diff(&rpctype.RunnerConnectRes{CheckUnsupportedCalls: true}, r); diff != "" { t.Errorf("Connect result mismatch (-want +got):\n%s", diff) } - want, got := map[int][]*progInfo{ - 0: {{idx: 1}}, - 1: nil, + want, got := map[int]runnerProgs{ + 0: {1: {idx: 1}}, + 1: {}, }, srv.pools[a.Pool].vmRunners if diff := cmp.Diff(want, got, cmp.AllowUnexported(progInfo{})); diff != "" { t.Errorf("srv.progs[a.Name] mismatch (-want +got):\n%s", diff) @@ -277,8 +276,8 @@ func TestUpdateUnsupported(t *testing.T) { func TestUpdateUnsupportedNotCalledTwice(t *testing.T) { vrf := Verifier{ pools: map[int]*poolInfo{ - 0: {vmRunners: map[int][]*progInfo{0: nil, 1: nil}, checked: false}, - 1: {vmRunners: map[int][]*progInfo{}, checked: false}, + 0: {vmRunners: map[int]runnerProgs{0: nil, 1: nil}, checked: false}, + 1: {vmRunners: map[int]runnerProgs{}, checked: false}, }, } srv, err := startRPCServer(&vrf) @@ -302,8 +301,8 @@ func TestUpdateUnsupportedNotCalledTwice(t *testing.T) { } wantPools := map[int]*poolInfo{ - 0: {vmRunners: map[int][]*progInfo{0: nil, 1: nil}, checked: true}, - 1: {vmRunners: map[int][]*progInfo{}, checked: false}, + 0: {vmRunners: map[int]runnerProgs{0: nil, 1: nil}, checked: true}, + 1: {vmRunners: map[int]runnerProgs{}, checked: false}, } if diff := cmp.Diff(wantPools, srv.pools, cmp.AllowUnexported(poolInfo{}, progInfo{})); diff != "" { t.Errorf("srv.pools mismatch (-want +got):\n%s", diff) @@ -493,8 +492,8 @@ func TestCleanup(t *testing.T) { srv := createTestServer(t) srv.progs = test.progs srv.pools = map[int]*poolInfo{ - 0: {vmRunners: map[int][]*progInfo{ - 0: {srv.progs[4]}}, + 0: {vmRunners: map[int]runnerProgs{ + 0: {4: srv.progs[4]}}, }, 1: {}, 2: {}} resultFile := filepath.Join(srv.vrf.resultsdir, "result-0") |
