Skip to content

Commit

Permalink
les/utils: protect against WeightedRandomSelect overflow (#21839)
Browse files Browse the repository at this point in the history
Also fixes a bug in les/flowcontrol that caused the overflow.
  • Loading branch information
zsfelfoldi authored Nov 23, 2020
1 parent 3ef5277 commit bddf5aa
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
4 changes: 4 additions & 0 deletions les/flowcontrol/control.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package flowcontrol

import (
"fmt"
"math"
"sync"
"time"

Expand Down Expand Up @@ -316,6 +317,9 @@ func (node *ServerNode) CanSend(maxCost uint64) (time.Duration, float64) {
node.lock.RLock()
defer node.lock.RUnlock()

if node.params.BufLimit == 0 {
return time.Duration(math.MaxInt64), 0
}
now := node.clock.Now()
node.recalcBLE(now)
maxCost += uint64(safetyMargin) * node.params.MinRecharge / uint64(fcTimeConst)
Expand Down
11 changes: 11 additions & 0 deletions les/utils/weighted_select.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@
package utils

import (
"math"
"math/rand"

"github.com/ethereum/go-ethereum/log"
)

type (
Expand Down Expand Up @@ -54,6 +57,14 @@ func (w *WeightedRandomSelect) IsEmpty() bool {

// setWeight sets an item's weight to a specific value (removes it if zero)
func (w *WeightedRandomSelect) setWeight(item WrsItem, weight uint64) {
if weight > math.MaxInt64-w.root.sumWeight {
// old weight is still included in sumWeight, remove and check again
w.setWeight(item, 0)
if weight > math.MaxInt64-w.root.sumWeight {
log.Error("WeightedRandomSelect overflow", "sumWeight", w.root.sumWeight, "new weight", weight)
weight = math.MaxInt64 - w.root.sumWeight
}
}
idx, ok := w.idx[item]
if ok {
w.root.setWeight(idx, weight)
Expand Down

0 comments on commit bddf5aa

Please sign in to comment.