Skip to content

Commit 11e6ab9

Browse files
authored
Remove max limit on event stream messages (#3009)
* Remove max limit on event stream messages * Add changelog
1 parent ccde625 commit 11e6ab9

File tree

4 files changed

+49
-20
lines changed

4 files changed

+49
-20
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "cd702d00-aeb0-46da-ad40-91fd8a26a0b4",
3+
"type": "bugfix",
4+
"description": "Remove max limit on event stream messages",
5+
"modules": [
6+
"aws/protocol/eventstream"
7+
]
8+
}

aws/protocol/eventstream/decode_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package eventstream
33
import (
44
"bytes"
55
"encoding/hex"
6+
"errors"
67
"io/ioutil"
78
"os"
89
"reflect"
@@ -141,6 +142,19 @@ func TestDecoder_DecodeMultipleMessages(t *testing.T) {
141142
}
142143
}
143144

145+
func TestDecodeLimits(t *testing.T) {
146+
l := 25 * 1024 * 1024 // Previously we failed if message was set to >16 MB
147+
payload := bytes.Repeat([]byte{0x01}, l) // if set to just 0, message will be read as having 0 size.
148+
buffer := bytes.NewBuffer(payload)
149+
_, err := NewDecoder().Decode(buffer, nil)
150+
if err == nil {
151+
t.Fatalf("expect error since message is not properly encoded, got none")
152+
}
153+
if errors.As(err, &LengthError{}) {
154+
t.Fatalf("expect error not being a length error, got %v", err)
155+
}
156+
}
157+
144158
func BenchmarkDecode(b *testing.B) {
145159
r := bytes.NewReader(testEncodedMsg)
146160
decoder := NewDecoder()

aws/protocol/eventstream/encode_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package eventstream
33
import (
44
"bytes"
55
"encoding/hex"
6+
"io"
67
"reflect"
78
"testing"
89
)
@@ -48,3 +49,27 @@ func BenchmarkEncode(b *testing.B) {
4849
}
4950
}
5051
}
52+
53+
func TestEncoder_Limits(t *testing.T) {
54+
l := 25 * 1024 * 1024 // Previously we failed if message was set to >16 MB
55+
payload := make([]byte, l)
56+
encoder := NewEncoder()
57+
err := encoder.Encode(io.Discard, Message{Payload: payload})
58+
if err != nil {
59+
t.Fatalf("Expected encoder being able to encode %d size, failed with %v", l, err)
60+
}
61+
62+
h := Header{
63+
Name: "event-id", Value: Int16Value(123),
64+
}
65+
66+
headers := make(Headers, 0, 10_000) // Previously we failed if headers size was above a certain size
67+
for i := 0; i < 10_000; i++ {
68+
headers = append(headers, h)
69+
}
70+
71+
err = encoder.Encode(io.Discard, Message{Headers: headers})
72+
if err != nil {
73+
t.Fatalf("Expected encoder being able to encode %d size, failed with %v", l, err)
74+
}
75+
}

aws/protocol/eventstream/message.go

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ const preludeLen = 8
1010
const preludeCRCLen = 4
1111
const msgCRCLen = 4
1212
const minMsgLen = preludeLen + preludeCRCLen + msgCRCLen
13-
const maxPayloadLen = 1024 * 1024 * 16 // 16MB
14-
const maxHeadersLen = 1024 * 128 // 128KB
15-
const maxMsgLen = minMsgLen + maxHeadersLen + maxPayloadLen
1613

1714
var crc32IEEETable = crc32.MakeTable(crc32.IEEE)
1815

@@ -82,28 +79,13 @@ func (p messagePrelude) PayloadLen() uint32 {
8279
}
8380

8481
func (p messagePrelude) ValidateLens() error {
85-
if p.Length == 0 || p.Length > maxMsgLen {
82+
if p.Length == 0 {
8683
return LengthError{
8784
Part: "message prelude",
88-
Want: maxMsgLen,
85+
Want: minMsgLen,
8986
Have: int(p.Length),
9087
}
9188
}
92-
if p.HeadersLen > maxHeadersLen {
93-
return LengthError{
94-
Part: "message headers",
95-
Want: maxHeadersLen,
96-
Have: int(p.HeadersLen),
97-
}
98-
}
99-
if payloadLen := p.PayloadLen(); payloadLen > maxPayloadLen {
100-
return LengthError{
101-
Part: "message payload",
102-
Want: maxPayloadLen,
103-
Have: int(payloadLen),
104-
}
105-
}
106-
10789
return nil
10890
}
10991

0 commit comments

Comments
 (0)