From c97f7904756c14a6f9a3d3db62881c9eadd0f6c2 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Mon, 13 May 2024 16:42:19 +0200 Subject: pkg/corpus: don't overwrite ProgsList There's still a risk of a race between the pointer overwriting and accesses to the embedded object. Let's use an internal replace() method instead. --- pkg/corpus/minimize.go | 7 +++---- pkg/corpus/prio.go | 32 ++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 16 deletions(-) (limited to 'pkg') diff --git a/pkg/corpus/minimize.go b/pkg/corpus/minimize.go index 938bd1d2e..b23f9f29e 100644 --- a/pkg/corpus/minimize.go +++ b/pkg/corpus/minimize.go @@ -32,12 +32,11 @@ func (corpus *Corpus) Minimize(cover bool) { }) corpus.progs = make(map[string]*Item) - // ProgramsList has its own mutex, so it'd be unsafe to - // overwrite it here, so let's create a new object. - corpus.ProgramsList = &ProgramsList{} + programsList := &ProgramsList{} for _, ctx := range signal.Minimize(inputs) { inp := ctx.(*Item) corpus.progs[inp.Sig] = inp - corpus.saveProgram(inp.Prog, inp.Signal) + programsList.saveProgram(inp.Prog, inp.Signal) } + corpus.ProgramsList.replace(programsList) } diff --git a/pkg/corpus/prio.go b/pkg/corpus/prio.go index a4d85a518..57f9ddaf5 100644 --- a/pkg/corpus/prio.go +++ b/pkg/corpus/prio.go @@ -19,18 +19,6 @@ type ProgramsList struct { accPrios []int64 } -func (pl *ProgramsList) saveProgram(p *prog.Prog, signal signal.Signal) { - pl.mu.Lock() - defer pl.mu.Unlock() - prio := int64(len(signal)) - if prio == 0 { - prio = 1 - } - pl.sumPrios += prio - pl.accPrios = append(pl.accPrios, pl.sumPrios) - pl.progs = append(pl.progs, p) -} - func (pl *ProgramsList) ChooseProgram(r *rand.Rand) *prog.Prog { pl.mu.RLock() defer pl.mu.RUnlock() @@ -49,3 +37,23 @@ func (pl *ProgramsList) Programs() []*prog.Prog { defer pl.mu.RUnlock() return pl.progs } + +func (pl *ProgramsList) saveProgram(p *prog.Prog, signal signal.Signal) { + pl.mu.Lock() + defer pl.mu.Unlock() + prio := int64(len(signal)) + if prio == 0 { + prio = 1 + } + pl.sumPrios += prio + pl.accPrios = append(pl.accPrios, pl.sumPrios) + pl.progs = append(pl.progs, p) +} + +func (pl *ProgramsList) replace(other *ProgramsList) { + pl.mu.Lock() + defer pl.mu.Unlock() + pl.sumPrios = other.sumPrios + pl.accPrios = other.accPrios + pl.progs = other.progs +} -- cgit mrf-deployment