Skip to content

Commit 57e24ca

Browse files
fishyJens-G
authored andcommitted
THRIFT-5369: Use MaxMessageSize to check container sizes
Client: go
1 parent 63e86ce commit 57e24ca

5 files changed

+87
-32
lines changed

CHANGES.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
- [THRIFT-5383](https://issues.apache.org/jira/browse/THRIFT-5383) - THRIFT-5383 TJSONProtocol Java readString throws on bounds check
88

9+
### Go
10+
11+
- [THRIFT-5369](https://issues.apache.org/jira/browse/THRIFT-5369) - No longer pre-allocating the whole container (map/set/list) in compiled go code to avoid huge allocations on malformed messages
12+
913

1014
## 0.14.1
1115

lib/go/thrift/binary_protocol.go

+6-13
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"bytes"
2424
"context"
2525
"encoding/binary"
26-
"errors"
2726
"fmt"
2827
"io"
2928
"math"
@@ -334,8 +333,6 @@ func (p *TBinaryProtocol) ReadFieldEnd(ctx context.Context) error {
334333
return nil
335334
}
336335

337-
var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length"))
338-
339336
func (p *TBinaryProtocol) ReadMapBegin(ctx context.Context) (kType, vType TType, size int, err error) {
340337
k, e := p.ReadByte(ctx)
341338
if e != nil {
@@ -354,8 +351,8 @@ func (p *TBinaryProtocol) ReadMapBegin(ctx context.Context) (kType, vType TType,
354351
err = NewTProtocolException(e)
355352
return
356353
}
357-
if size32 < 0 {
358-
err = invalidDataLength
354+
err = checkSizeForProtocol(size32, p.cfg)
355+
if err != nil {
359356
return
360357
}
361358
size = int(size32)
@@ -378,8 +375,8 @@ func (p *TBinaryProtocol) ReadListBegin(ctx context.Context) (elemType TType, si
378375
err = NewTProtocolException(e)
379376
return
380377
}
381-
if size32 < 0 {
382-
err = invalidDataLength
378+
err = checkSizeForProtocol(size32, p.cfg)
379+
if err != nil {
383380
return
384381
}
385382
size = int(size32)
@@ -403,8 +400,8 @@ func (p *TBinaryProtocol) ReadSetBegin(ctx context.Context) (elemType TType, siz
403400
err = NewTProtocolException(e)
404401
return
405402
}
406-
if size32 < 0 {
407-
err = invalidDataLength
403+
err = checkSizeForProtocol(size32, p.cfg)
404+
if err != nil {
408405
return
409406
}
410407
size = int(size32)
@@ -466,10 +463,6 @@ func (p *TBinaryProtocol) ReadString(ctx context.Context) (value string, err err
466463
if err != nil {
467464
return
468465
}
469-
if size < 0 {
470-
err = invalidDataLength
471-
return
472-
}
473466
if size == 0 {
474467
return "", nil
475468
}

lib/go/thrift/compact_protocol.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,8 @@ func (p *TCompactProtocol) ReadMapBegin(ctx context.Context) (keyType TType, val
477477
err = NewTProtocolException(e)
478478
return
479479
}
480-
if size32 < 0 {
481-
err = invalidDataLength
480+
err = checkSizeForProtocol(size32, p.cfg)
481+
if err != nil {
482482
return
483483
}
484484
size = int(size32)
@@ -513,12 +513,12 @@ func (p *TCompactProtocol) ReadListBegin(ctx context.Context) (elemType TType, s
513513
err = NewTProtocolException(e)
514514
return
515515
}
516-
if size2 < 0 {
517-
err = invalidDataLength
518-
return
519-
}
520516
size = int(size2)
521517
}
518+
err = checkSizeForProtocol(size32, p.cfg)
519+
if err != nil {
520+
return
521+
}
522522
elemType, e := p.getTType(tCompactType(size_and_type))
523523
if e != nil {
524524
err = NewTProtocolException(e)

lib/go/thrift/json_protocol.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,13 @@ func (p *TJSONProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueT
311311
}
312312

313313
// read size
314-
iSize, e := p.ReadI64(ctx)
315-
if e != nil {
316-
return keyType, valueType, size, e
314+
iSize, err := p.ReadI64(ctx)
315+
if err != nil {
316+
return keyType, valueType, size, err
317+
}
318+
err = checkSizeForProtocol(int32(iSize), p.cfg)
319+
if err != nil {
320+
return keyType, valueType, 0, err
317321
}
318322
size = int(iSize)
319323

@@ -485,9 +489,16 @@ func (p *TJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error)
485489
if err != nil {
486490
return elemType, size, err
487491
}
488-
nSize, _, err2 := p.ParseI64()
492+
nSize, _, err := p.ParseI64()
493+
if err != nil {
494+
return elemType, 0, err
495+
}
496+
err = checkSizeForProtocol(int32(nSize), p.cfg)
497+
if err != nil {
498+
return elemType, 0, err
499+
}
489500
size = int(nSize)
490-
return elemType, size, err2
501+
return elemType, size, nil
491502
}
492503

493504
func (p *TJSONProtocol) readElemListBegin() (elemType TType, size int, e error) {

lib/go/thrift/simple_json_protocol.go

+55-8
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,27 @@ var errEmptyJSONContextStack = NewTProtocolExceptionWithType(INVALID_DATA, error
9797
type TSimpleJSONProtocol struct {
9898
trans TTransport
9999

100+
cfg *TConfiguration
101+
100102
parseContextStack jsonContextStack
101103
dumpContext jsonContextStack
102104

103105
writer *bufio.Writer
104106
reader *bufio.Reader
105107
}
106108

107-
// Constructor
109+
// Deprecated: Use NewTSimpleJSONProtocolConf instead.:
108110
func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol {
109-
v := &TSimpleJSONProtocol{trans: t,
111+
return NewTSimpleJSONProtocolConf(t, &TConfiguration{
112+
noPropagation: true,
113+
})
114+
}
115+
116+
func NewTSimpleJSONProtocolConf(t TTransport, conf *TConfiguration) *TSimpleJSONProtocol {
117+
PropagateTConfiguration(t, conf)
118+
v := &TSimpleJSONProtocol{
119+
trans: t,
120+
cfg: conf,
110121
writer: bufio.NewWriter(t),
111122
reader: bufio.NewReader(t),
112123
}
@@ -116,14 +127,32 @@ func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol {
116127
}
117128

118129
// Factory
119-
type TSimpleJSONProtocolFactory struct{}
130+
type TSimpleJSONProtocolFactory struct {
131+
cfg *TConfiguration
132+
}
120133

121134
func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol {
122-
return NewTSimpleJSONProtocol(trans)
135+
return NewTSimpleJSONProtocolConf(trans, p.cfg)
123136
}
124137

138+
// SetTConfiguration implements TConfigurationSetter for propagation.
139+
func (p *TSimpleJSONProtocolFactory) SetTConfiguration(conf *TConfiguration) {
140+
p.cfg = conf
141+
}
142+
143+
// Deprecated: Use NewTSimpleJSONProtocolFactoryConf instead.
125144
func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory {
126-
return &TSimpleJSONProtocolFactory{}
145+
return &TSimpleJSONProtocolFactory{
146+
cfg: &TConfiguration{
147+
noPropagation: true,
148+
},
149+
}
150+
}
151+
152+
func NewTSimpleJSONProtocolFactoryConf(conf *TConfiguration) *TSimpleJSONProtocolFactory {
153+
return &TSimpleJSONProtocolFactory{
154+
cfg: conf,
155+
}
127156
}
128157

129158
var (
@@ -399,6 +428,13 @@ func (p *TSimpleJSONProtocol) ReadMapBegin(ctx context.Context) (keyType TType,
399428

400429
// read size
401430
iSize, err := p.ReadI64(ctx)
431+
if err != nil {
432+
return keyType, valueType, 0, err
433+
}
434+
err = checkSizeForProtocol(int32(size), p.cfg)
435+
if err != nil {
436+
return keyType, valueType, 0, err
437+
}
402438
size = int(iSize)
403439
return keyType, valueType, size, err
404440
}
@@ -1070,9 +1106,16 @@ func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e
10701106
if err != nil {
10711107
return elemType, size, err
10721108
}
1073-
nSize, _, err2 := p.ParseI64()
1109+
nSize, _, err := p.ParseI64()
1110+
if err != nil {
1111+
return elemType, 0, err
1112+
}
1113+
err = checkSizeForProtocol(int32(nSize), p.cfg)
1114+
if err != nil {
1115+
return elemType, 0, err
1116+
}
10741117
size = int(nSize)
1075-
return elemType, size, err2
1118+
return elemType, size, nil
10761119
}
10771120

10781121
func (p *TSimpleJSONProtocol) ParseListEnd() error {
@@ -1368,6 +1411,10 @@ func (p *TSimpleJSONProtocol) write(b []byte) (int, error) {
13681411
// SetTConfiguration implements TConfigurationSetter for propagation.
13691412
func (p *TSimpleJSONProtocol) SetTConfiguration(conf *TConfiguration) {
13701413
PropagateTConfiguration(p.trans, conf)
1414+
p.cfg = conf
13711415
}
13721416

1373-
var _ TConfigurationSetter = (*TSimpleJSONProtocol)(nil)
1417+
var (
1418+
_ TConfigurationSetter = (*TSimpleJSONProtocol)(nil)
1419+
_ TConfigurationSetter = (*TSimpleJSONProtocolFactory)(nil)
1420+
)

0 commit comments

Comments
 (0)