Skip to content

Commit 87ff9fa

Browse files
committed
fix: length overflow
Change-Id: I264be2c190bb6d45053a693ac3eb4b8fd90b9d6f
1 parent b23c46b commit 87ff9fa

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

proto/httproto/httproto.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ import (
2626
"strings"
2727
"sync"
2828

29+
"github.com/henrylee2cn/goutil"
30+
2931
"github.com/henrylee2cn/erpc/v6"
3032
"github.com/henrylee2cn/erpc/v6/codec"
3133
"github.com/henrylee2cn/erpc/v6/utils"
3234
"github.com/henrylee2cn/erpc/v6/xfer"
3335
"github.com/henrylee2cn/erpc/v6/xfer/gzip"
34-
"github.com/henrylee2cn/goutil"
3536
)
3637

3738
var (
@@ -394,7 +395,7 @@ func (h *httproto) unpack(m erpc.Message, bb *utils.ByteBuffer) (size int, msg [
394395
}
395396
m.Meta().SetBytesKV(a[0], a[1])
396397
}
397-
if bodySize == 0 {
398+
if bodySize <= 0 {
398399
return size, msg, nil
399400
}
400401
bb.ChangeLen(bodySize)

socket/message_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package socket
33
import (
44
"testing"
55

6+
"github.com/stretchr/testify/assert"
7+
68
"github.com/henrylee2cn/erpc/v6/xfer/gzip"
79
)
810

@@ -26,3 +28,19 @@ func TestMessageString(t *testing.T) {
2628
t.Logf("%%#v:%#v", m)
2729
t.Logf("%%+v:%+v", m)
2830
}
31+
32+
func TestUint32Minus(t *testing.T) {
33+
a := 1
34+
a, err := minus(a, 4)
35+
assert.EqualError(t, err, "raw proto: bad package")
36+
assert.Equal(t, int(1), a)
37+
a, err = minus(a, 0)
38+
assert.NoError(t, err)
39+
assert.Equal(t, int(1), a)
40+
a, err = minus(a, 1)
41+
assert.NoError(t, err)
42+
assert.Equal(t, int(0), a)
43+
a, err = minus(a, 1)
44+
assert.EqualError(t, err, "raw proto: bad package")
45+
assert.Equal(t, int(0), a)
46+
}

socket/protocol.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ import (
2222
"strconv"
2323
"sync"
2424

25-
"github.com/henrylee2cn/erpc/v6/utils"
2625
"github.com/henrylee2cn/goutil"
26+
27+
"github.com/henrylee2cn/erpc/v6/utils"
2728
)
2829

2930
type (
@@ -229,12 +230,16 @@ func (r *rawProto) readMessage(bb *utils.ByteBuffer, m Message) error {
229230
if err != nil {
230231
return err
231232
}
232-
lastSize := binary.BigEndian.Uint32(bb.B)
233-
if err = m.SetSize(lastSize); err != nil {
233+
_lastSize := binary.BigEndian.Uint32(bb.B)
234+
if err = m.SetSize(_lastSize); err != nil {
234235
return err
235236
}
236-
lastSize -= 4
237-
bb.ChangeLen(int(lastSize))
237+
lastSize := int(_lastSize)
238+
lastSize, err = minus(lastSize, 4)
239+
if err != nil {
240+
return err
241+
}
242+
bb.ChangeLen(lastSize)
238243

239244
// transfer pipe
240245
_, err = io.ReadFull(r.r, bb.B[:1])
@@ -252,14 +257,24 @@ func (r *rawProto) readMessage(bb *utils.ByteBuffer, m Message) error {
252257
return err
253258
}
254259
}
255-
lastSize -= (1 + uint32(xferLen))
256-
260+
lastSize, err = minus(lastSize, 1+int(xferLen))
261+
if err != nil {
262+
return err
263+
}
257264
// read last all
258-
bb.ChangeLen(int(lastSize))
265+
bb.ChangeLen(lastSize)
259266
_, err = io.ReadFull(r.r, bb.B)
260267
return err
261268
}
262269

270+
func minus(a int, b int) (int, error) {
271+
r := a - b
272+
if r < 0 || b < 0 {
273+
return a, errors.New("raw proto: bad package")
274+
}
275+
return r, nil
276+
}
277+
263278
func (r *rawProto) readHeader(data []byte, m Message) ([]byte, error) {
264279
// seq
265280
seqLen := data[0]

utils/bytebuffer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (b *ByteBuffer) Reset() {
113113
func (b *ByteBuffer) ChangeLen(newLen int) {
114114
if cap(b.B) < newLen {
115115
b.B = make([]byte, newLen)
116-
} else {
116+
} else if newLen >= 0 {
117117
b.B = b.B[:newLen]
118118
}
119119
}

0 commit comments

Comments
 (0)