fix: prevent ring index overflow (#3738)

master
POABOB 1 year ago committed by GitHub
parent 5e8e21b257
commit c220b5d886
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,6 +1,8 @@
package collection package collection
import "sync" import (
"sync"
)
// A Ring can be used as fixed size ring. // A Ring can be used as fixed size ring.
type Ring struct { type Ring struct {
@ -25,8 +27,15 @@ func (r *Ring) Add(v any) {
r.lock.Lock() r.lock.Lock()
defer r.lock.Unlock() defer r.lock.Unlock()
r.elements[r.index%len(r.elements)] = v ringLength := len(r.elements)
r.elements[r.index%ringLength] = v
r.index++ r.index++
// prevent ring index overflow
if r.index/ringLength >= 2 {
r.index = r.index - ringLength
}
} }
// Take takes all items from r. // Take takes all items from r.
@ -36,16 +45,18 @@ func (r *Ring) Take() []any {
var size int var size int
var start int var start int
if r.index > len(r.elements) { ringLength := len(r.elements)
size = len(r.elements)
start = r.index % len(r.elements) if r.index > ringLength {
size = ringLength
start = r.index % ringLength
} else { } else {
size = r.index size = r.index
} }
elements := make([]any, size) elements := make([]any, size)
for i := 0; i < size; i++ { for i := 0; i < size; i++ {
elements[i] = r.elements[(start+i)%len(r.elements)] elements[i] = r.elements[(start+i)%ringLength]
} }
return elements return elements

Loading…
Cancel
Save