This commit is contained in:
Vendored
+39
-2
@@ -152,6 +152,9 @@ type Cmpp3SubmitRspPkt struct {
|
||||
// Before calling Pack, you should initialize a Cmpp2SubmitReqPkt variable
|
||||
// with correct field value.
|
||||
func (p *Cmpp2SubmitReqPkt) Pack(seqId uint32) ([]byte, error) {
|
||||
if err := validateSubmit(p.DestUsrTl, p.DestTerminalId, p.MsgFmt, p.MsgLength, p.MsgContent); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var pktLen uint32 = CMPP_HEADER_LEN + 117 + uint32(p.DestUsrTl)*21 + 1 + uint32(p.MsgLength) + 8
|
||||
|
||||
var w = newPacketWriter(pktLen)
|
||||
@@ -200,6 +203,8 @@ func (p *Cmpp2SubmitReqPkt) Pack(seqId uint32) ([]byte, error) {
|
||||
// Usually it is used in server side. After unpack, you will get all value of fields in
|
||||
// Cmpp2SubmitReqPkt struct.
|
||||
func (p *Cmpp2SubmitReqPkt) Unpack(data []byte) error {
|
||||
p.DestTerminalId = nil
|
||||
|
||||
var r = newPacketReader(data)
|
||||
|
||||
// Sequence Id
|
||||
@@ -259,7 +264,13 @@ func (p *Cmpp2SubmitReqPkt) Unpack(data []byte) error {
|
||||
reserve := r.ReadCString(8)
|
||||
p.Reserve = string(reserve)
|
||||
|
||||
return r.Error()
|
||||
if err := r.Error(); err != nil {
|
||||
return err
|
||||
}
|
||||
if len(data) != 130+int(p.DestUsrTl)*21+int(p.MsgLength) {
|
||||
return errSubmitInvalidStruct
|
||||
}
|
||||
return validateSubmit(p.DestUsrTl, p.DestTerminalId, p.MsgFmt, p.MsgLength, p.MsgContent)
|
||||
}
|
||||
|
||||
// Pack packs the Cmpp2SubmitRspPkt to bytes stream for Server side.
|
||||
@@ -302,6 +313,9 @@ func (p *Cmpp2SubmitRspPkt) Unpack(data []byte) error {
|
||||
// Before calling Pack, you should initialize a Cmpp3SubmitReqPkt variable
|
||||
// with correct field value.
|
||||
func (p *Cmpp3SubmitReqPkt) Pack(seqId uint32) ([]byte, error) {
|
||||
if err := validateSubmit(p.DestUsrTl, p.DestTerminalId, p.MsgFmt, p.MsgLength, p.MsgContent); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var pktLen uint32 = CMPP_HEADER_LEN + 129 + uint32(p.DestUsrTl)*32 + 1 + 1 + uint32(p.MsgLength) + 20
|
||||
|
||||
var w = newPacketWriter(pktLen)
|
||||
@@ -352,6 +366,8 @@ func (p *Cmpp3SubmitReqPkt) Pack(seqId uint32) ([]byte, error) {
|
||||
// Usually it is used in server side. After unpack, you will get all value of fields in
|
||||
// Cmpp3SubmitReqPkt struct.
|
||||
func (p *Cmpp3SubmitReqPkt) Unpack(data []byte) error {
|
||||
p.DestTerminalId = nil
|
||||
|
||||
var r = newPacketReader(data)
|
||||
|
||||
// Sequence Id
|
||||
@@ -413,7 +429,13 @@ func (p *Cmpp3SubmitReqPkt) Unpack(data []byte) error {
|
||||
linkId := r.ReadCString(20)
|
||||
p.LinkId = string(linkId)
|
||||
|
||||
return r.Error()
|
||||
if err := r.Error(); err != nil {
|
||||
return err
|
||||
}
|
||||
if len(data) != 155+int(p.DestUsrTl)*32+int(p.MsgLength) {
|
||||
return errSubmitInvalidStruct
|
||||
}
|
||||
return validateSubmit(p.DestUsrTl, p.DestTerminalId, p.MsgFmt, p.MsgLength, p.MsgContent)
|
||||
}
|
||||
|
||||
// Pack packs the Cmpp3SubmitRspPkt to bytes stream for Server side.
|
||||
@@ -451,3 +473,18 @@ func (p *Cmpp3SubmitRspPkt) Unpack(data []byte) error {
|
||||
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// The receive buffer is bounded separately; validate counts before accepting the body.
|
||||
func validateSubmit(count uint8, destinations []string, format, length uint8, content string) error {
|
||||
if count == 0 || count > 99 || int(count) != len(destinations) {
|
||||
return errSubmitInvalidStruct
|
||||
}
|
||||
limit := 140
|
||||
if format == 0 {
|
||||
limit = 159 // CMPP specifies ASCII <160 bytes; other formats <=140.
|
||||
}
|
||||
if int(length) != len(content) || len(content) > limit {
|
||||
return errSubmitInvalidMsgLength
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user