import (
"encoding/binary"
+ "errors"
"fmt"
"io"
"math"
return nil
}
+var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length"))
+
func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) {
k, e := p.ReadByte()
if e != nil {
}
vType = TType(v)
size32, e := p.ReadI32()
- size = int(size32)
if e != nil {
err = NewTProtocolException(e)
return
}
+ if size32 < 0 {
+ err = invalidDataLength
+ return
+ }
+ size = int(size32)
return kType, vType, size, nil
}
}
elemType = TType(b)
size32, e := p.ReadI32()
- size = int(size32)
if e != nil {
err = NewTProtocolException(e)
return
}
- return elemType, size, nil
+ if size32 < 0 {
+ err = invalidDataLength
+ return
+ }
+ size = int(size32)
+
+ return
}
func (p *TBinaryProtocol) ReadListEnd() error {
}
elemType = TType(b)
size32, e := p.ReadI32()
- size = int(size32)
if e != nil {
err = NewTProtocolException(e)
return
}
+ if size32 < 0 {
+ err = invalidDataLength
+ return
+ }
+ size = int(size32)
return elemType, size, nil
}
if e != nil {
return "", e
}
+ if size < 0 {
+ err = invalidDataLength
+ return
+ }
+
return p.readStringBody(int(size))
}
if e != nil {
return nil, e
}
+ if size < 0 {
+ return nil, invalidDataLength
+ }
+
isize := int(size)
buf := make([]byte, isize)
_, err := io.ReadFull(p.trans, buf)
// "correct" types.
func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) {
size32, e := p.readVarint32()
- size = int(size32)
if e != nil {
err = NewTProtocolException(e)
return
}
+ if size32 < 0 {
+ err = invalidDataLength
+ return
+ }
+ size = int(size32)
+
keyAndValueType := byte(STOP)
if size != 0 {
keyAndValueType, err = p.ReadByte()
err = NewTProtocolException(e)
return
}
+ if size2 < 0 {
+ err = invalidDataLength
+ return
+ }
size = int(size2)
}
elemType, e := p.getTType(tCompactType(size_and_type))
if e != nil {
return "", NewTProtocolException(e)
}
+ if length < 0 {
+ return "", invalidDataLength
+ }
+
if length == 0 {
return "", nil
}
return nil, NewTProtocolException(e)
}
if length == 0 {
- return nil, nil //nil == empty slice
+ return []byte{}, nil
+ }
+ if length < 0 {
+ return nil, invalidDataLength
}
buf := make([]byte, length)
import (
"log"
+ "runtime/debug"
)
// Simple, non-concurrent server for testing.
}
if client != nil {
go func() {
- if err := p.processRequest(client); err != nil {
+ if err := p.processRequests(client); err != nil {
log.Println("error processing request:", err)
}
}()
return nil
}
-func (p *TSimpleServer) processRequest(client TTransport) error {
+func (p *TSimpleServer) processRequests(client TTransport) error {
processor := p.processorFactory.GetProcessor(client)
inputTransport := p.inputTransportFactory.GetTransport(client)
outputTransport := p.outputTransportFactory.GetTransport(client)
inputProtocol := p.inputProtocolFactory.GetProtocol(inputTransport)
outputProtocol := p.outputProtocolFactory.GetProtocol(outputTransport)
+ defer func() {
+ if e := recover(); e != nil {
+ log.Printf("panic in processor: %s: %s", e, debug.Stack())
+ }
+ }()
if inputTransport != nil {
defer inputTransport.Close()
}
if err, ok := err.(TTransportException); ok && err.TypeId() == END_OF_FILE {
return nil
} else if err != nil {
+ log.Printf("error processing request: %s", err)
return err
}
if !ok {
package common
import (
- thrifttest "gen/thrifttest"
gomock "code.google.com/p/gomock/gomock"
+ thrifttest "gen/thrifttest"
)
// Mock of ThriftTest interface