Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions message.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@ func ParseMessageWithDataDictionary(
}
}

if fieldCount == 0 {
return parseError{OrigError: fmt.Sprintf("No Fields detected in %s", string(rawBytes))}
}

if cap(msg.fields) < fieldCount {
msg.fields = make([]TagValue, fieldCount)
} else {
Expand Down
7 changes: 7 additions & 0 deletions message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ func (s *MessageSuite) SetupTest() {
s.msg = NewMessage()
}

func (s *MessageSuite) TestParseMessageEmpty() {
rawMsg := bytes.NewBufferString("")

err := ParseMessage(s.msg, rawMsg)
s.NotNil(err)
}

func (s *MessageSuite) TestParseMessage() {
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=039")

Expand Down
10 changes: 10 additions & 0 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package quickfix

import (
"bytes"
"errors"
"io"
"time"

Expand Down Expand Up @@ -111,10 +112,19 @@ func (p *parser) jumpLength() (int, error) {
return 0, err
}

if offset == lengthIndex {
return 0, errors.New("No length given")
}

length, err := atoi(p.buffer[lengthIndex:offset])
if err != nil {
return length, err
}

if length <= 0 {
return length, errors.New("Invalid length")
}

return offset + length, nil
}

Expand Down
14 changes: 14 additions & 0 deletions parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ func (s *ParserSuite) SetupTest() {
s.parser = new(parser)
}

func (s *ParserSuite) TestInvalidNilLength() {
stream := "8=\x019=\x01"
s.reader = strings.NewReader(stream)
_, err := s.ReadMessage()
s.NotNil(err)
}

func (s *ParserSuite) TestOverflowLength() {
stream := "8=\x019=9300000000000000000\x01"
s.reader = strings.NewReader(stream)
_, err := s.ReadMessage()
s.NotNil(err)
}

func (s *ParserSuite) TestJumpLength() {
stream := "8=FIXT.1.19=11135=D34=449=TW52=20140511-23:10:3456=ISLD11=ID21=340=154=155=INTC60=20140511-23:10:3410=2348=FIXT.1.19=9535=D34=549=TW52=20140511-23:10:3456=ISLD11=ID21=340=154=155=INTC60=20140511-23:10:3410=198"

Expand Down
16 changes: 8 additions & 8 deletions tag_value.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,27 +23,27 @@ func (tv *TagValue) init(tag Tag, value []byte) {
tv.value = value
}

func (tv *TagValue) parse(rawFieldBytes []byte) (err error) {
func (tv *TagValue) parse(rawFieldBytes []byte) error {
sepIndex := bytes.IndexByte(rawFieldBytes, '=')

if sepIndex == -1 {
err = fmt.Errorf("tagValue.Parse: No '=' in '%s'", rawFieldBytes)
return
switch sepIndex {
case -1:
return fmt.Errorf("tagValue.Parse: No '=' in '%s'", rawFieldBytes)
case 0:
return fmt.Errorf("tagValue.Parse: No tag in '%s'", rawFieldBytes)
}

parsedTag, err := atoi(rawFieldBytes[:sepIndex])

if err != nil {
err = fmt.Errorf("tagValue.Parse: %s", err.Error())
return
return fmt.Errorf("tagValue.Parse: %s", err.Error())
}

tv.tag = Tag(parsedTag)
n := len(rawFieldBytes)
tv.value = rawFieldBytes[(sepIndex + 1):(n - 1):(n - 1)]
tv.bytes = rawFieldBytes[:n:n]

return
return nil
}

func (tv TagValue) String() string {
Expand Down
13 changes: 5 additions & 8 deletions tag_value_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,8 @@ func TestTagValue_parse(t *testing.T) {
stringField := "8=FIX.4.0"
tv := TagValue{}
err := tv.parse([]byte(stringField))

if err != nil {
t.Error("Unexpected error", err)
}

if tv.tag != Tag(8) {
t.Error("Unexpected tag", tv.tag)
}
assert.Nil(t, err)
assert.Equal(t, Tag(8), tv.tag)

if !bytes.Equal(tv.bytes, []byte(stringField)) {
t.Errorf("Expected %v got %v", stringField, tv.bytes)
Expand All @@ -52,6 +46,9 @@ func TestTagValue_parseFail(t *testing.T) {

stringField = "tag_not_an_int=uhoh"
assert.NotNil(t, tv.parse([]byte(stringField)))

stringField = "=notag"
assert.NotNil(t, tv.parse([]byte(stringField)))
}

func TestTagValue_String(t *testing.T) {
Expand Down