aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/corpus/prio.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/corpus/prio.go')
-rw-r--r--pkg/corpus/prio.go25
1 files changed, 24 insertions, 1 deletions
diff --git a/pkg/corpus/prio.go b/pkg/corpus/prio.go
index 4d0053850..db2a4c28d 100644
--- a/pkg/corpus/prio.go
+++ b/pkg/corpus/prio.go
@@ -7,6 +7,7 @@ import (
"math/rand"
"sort"
+ "github.com/google/syzkaller/pkg/hash"
"github.com/google/syzkaller/pkg/signal"
"github.com/google/syzkaller/prog"
)
@@ -49,6 +50,17 @@ func (pl *ProgramsList) saveProgram(p *prog.Prog, signal signal.Signal) {
}
}
+func (pl *ProgramsList) modifyPriority(p *prog.Prog, probSignal signal.Signal, koef int64) {
+ prio := int64(len(probSignal))
+ if prio == 0 {
+ prio = 1
+ }
+
+ if ind, ok := pl.progToInd[p]; ok {
+ pl.prios.add(ind, koef*prio)
+ }
+}
+
func (corpus *Corpus) ChooseProgram(r *rand.Rand) *prog.Prog {
corpus.mu.RLock()
defer corpus.mu.RUnlock()
@@ -80,7 +92,18 @@ func (corpus *Corpus) ChooseProgram(r *rand.Rand) *prog.Prog {
if randArea != nil {
return randArea.chooseProgram(r)
}
- return corpus.chooseProgram(r)
+
+ prog := corpus.chooseProgram(r)
+ progData := prog.Serialize()
+ sig := hash.String(progData)
+
+ item := corpus.progsMap[sig]
+ if item.ExecLast > 0 {
+ corpus.modifyPriority(prog, item.Signal, -1)
+ item.ExecLast--
+ }
+
+ return prog
}
func (corpus *Corpus) Programs() []*prog.Prog {