aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsyz-verifier/main.go27
-rw-r--r--syz-verifier/main_test.go31
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")