aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-05-13 16:42:19 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-05-13 15:11:49 +0000
commitc97f7904756c14a6f9a3d3db62881c9eadd0f6c2 (patch)
tree4196da995db053bdac7af4189916de54c209b6a9 /pkg
parent4a623fface69b3124c66c6b0859ab1fc08b47e47 (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')
-rw-r--r--pkg/corpus/minimize.go7
-rw-r--r--pkg/corpus/prio.go32
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
+}