aboutsummaryrefslogtreecommitdiffstats
path: root/syz-verifier/main.go
diff options
context:
space:
mode:
authorMara Mihali <maramihali@google.com>2021-07-22 08:39:18 +0000
committermaramihali <maramihali@google.com>2021-07-22 16:20:08 +0300
commitbc5f1d88c519868f37bd2b5ebca79b33a659c2c9 (patch)
tree0013d28020920241b9469dcb9373a4d5a232e92f /syz-verifier/main.go
parentc50b63938b839e34c2b3008f5ba9cb868a0643a6 (diff)
syz-verifier: change poolInfo.vmRunners from a slice to a map
vmRunners holds what programs have been sent to each Runner. Previously, entries would only be removed from this map when a VM crashes as the programs were stored in a slice. Modified vmRunners to hold programs as a map in order to easily query and delete the entries.
Diffstat (limited to 'syz-verifier/main.go')
-rwxr-xr-xsyz-verifier/main.go27
1 files changed, 11 insertions, 16 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
}
}