diff options
Diffstat (limited to 'pkg/corpus/prio.go')
| -rw-r--r-- | pkg/corpus/prio.go | 25 |
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 { |
