Skip to content

Commit 09e2c01

Browse files
committed
fix shaper prio overflow
1 parent eba6ee1 commit 09e2c01

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

session.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ var (
2424
)
2525

2626
type writeRequest struct {
27-
prio uint64
27+
prio uint32
2828
frame Frame
2929
result chan writeResult
3030
}
@@ -496,7 +496,7 @@ func (s *Session) writeFrame(f Frame) (n int, err error) {
496496
}
497497

498498
// internal writeFrame version to support deadline used in keepalive
499-
func (s *Session) writeFrameInternal(f Frame, deadline <-chan time.Time, prio uint64) (int, error) {
499+
func (s *Session) writeFrameInternal(f Frame, deadline <-chan time.Time, prio uint32) (int, error) {
500500
req := writeRequest{
501501
prio: prio,
502502
frame: f,

shaper.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package smux
22

3+
func _itimediff(later, earlier uint32) int32 {
4+
return (int32)(later - earlier)
5+
}
6+
37
type shaperHeap []writeRequest
48

59
func (h shaperHeap) Len() int { return len(h) }
6-
func (h shaperHeap) Less(i, j int) bool { return h[i].prio < h[j].prio }
10+
func (h shaperHeap) Less(i, j int) bool { return _itimediff(h[j].prio, h[i].prio) > 0 }
711
func (h shaperHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
812
func (h *shaperHeap) Push(x interface{}) { *h = append(*h, x.(writeRequest)) }
913

shaper_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ func TestShaper(t *testing.T) {
1010
w2 := writeRequest{prio: 10}
1111
w3 := writeRequest{prio: 20}
1212
w4 := writeRequest{prio: 100}
13+
w5 := writeRequest{prio: (1 << 32) - 1}
1314

1415
var reqs shaperHeap
16+
heap.Push(&reqs, w5)
1517
heap.Push(&reqs, w4)
1618
heap.Push(&reqs, w3)
1719
heap.Push(&reqs, w2)
1820
heap.Push(&reqs, w1)
1921

20-
var lastPrio uint64
22+
var lastPrio = reqs[0].prio
2123
for len(reqs) > 0 {
2224
w := heap.Pop(&reqs).(writeRequest)
23-
if w.prio < lastPrio {
25+
if int32(w.prio-lastPrio) < 0 {
2426
t.Fatal("incorrect shaper priority")
2527
}
2628

stream.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ func (s *Stream) Write(b []byte) (n int, err error) {
325325
}
326326
frame.data = bts[:sz]
327327
bts = bts[sz:]
328-
n, err := s.sess.writeFrameInternal(frame, deadline, uint64(s.numWritten))
328+
n, err := s.sess.writeFrameInternal(frame, deadline, s.numWritten)
329329
s.numWritten++
330330
sent += n
331331
if err != nil {
@@ -393,7 +393,7 @@ func (s *Stream) writeV2(b []byte) (n int, err error) {
393393
}
394394
frame.data = bts[:sz]
395395
bts = bts[sz:]
396-
n, err := s.sess.writeFrameInternal(frame, deadline, uint64(atomic.LoadUint32(&s.numWritten)))
396+
n, err := s.sess.writeFrameInternal(frame, deadline, atomic.LoadUint32(&s.numWritten))
397397
atomic.AddUint32(&s.numWritten, uint32(sz))
398398
sent += n
399399
if err != nil {

0 commit comments

Comments
 (0)