diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-05-13 16:42:19 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-05-13 15:11:49 +0000 |
| commit | c97f7904756c14a6f9a3d3db62881c9eadd0f6c2 (patch) | |
| tree | 4196da995db053bdac7af4189916de54c209b6a9 /pkg/corpus | |
| parent | 4a623fface69b3124c66c6b0859ab1fc08b47e47 (diff) | |
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.
Diffstat (limited to 'pkg/corpus')
| -rw-r--r-- | pkg/corpus/minimize.go | 7 | ||||
| -rw-r--r-- | pkg/corpus/prio.go | 32 |
2 files changed, 23 insertions, 16 deletions
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 +} |
