Skip to content

Commit a72944a

Browse files
authored
Parsing an invalid FIX message could cause infinite loop. (#434)
Corrected `FIXMessageDecoder`
1 parent fe97874 commit a72944a

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

quickfixj-core/src/main/java/quickfix/mina/message/FIXMessageDecoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ private boolean parseMessage(IoBuffer in, ProtocolDecoderOutput out)
170170
} else {
171171
if (position < in.limit()) { // if data remains
172172
String messageString = getMessageStringForError(in);
173-
handleError(in, in.position() + 1, "Length format error in message (last character: " + (char)ch + "): " + messageString,
174-
false);
173+
handleError(in, position, "Length format error in message (last character: " + (char) ch + "): " + messageString,
174+
false);
175175
continue;
176176
} else {
177177
break;

quickfixj-core/src/test/java/quickfix/mina/message/FIXMessageDecoderTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,4 +490,30 @@ public void testBadBodyLength() throws Exception {
490490
setUpBuffer(message);
491491
assertMessageFound(goodMessage);
492492
}
493+
494+
/**
495+
* Several bad messages after each other should not send the decoder in an
496+
* infinite loop. https://github.com/quickfix-j/quickfixj/issues/432
497+
*/
498+
@Test(timeout = 1000)
499+
public void testLengthFormatError() throws Exception {
500+
String badMessages = "8=FIX.4.4\0019=058=\0018=FIX.4.4\0019=058=\0018=FIX.4.4\0019=058=\0018=FIX.4.4\0019=058=\001";
501+
String goodMessage = "8=FIX.4.4\0019=12\00135=Y\001108=30\00110=037\001";
502+
setUpBuffer(badMessages + goodMessage + badMessages + goodMessage);
503+
assertMessageFound(goodMessage, 2);
504+
}
505+
506+
/**
507+
* Several bad messages after each other should not send the decoder in an
508+
* infinite loop. https://github.com/quickfix-j/quickfixj/issues/432
509+
*/
510+
@Test(timeout = 1000)
511+
public void testLengthFormatError2() throws Exception {
512+
decoder = new FIXMessageDecoder("UTF-16");
513+
setUpBuffer("8=FIX.4.2\0019=128=FIX.4.2\0019=8=FIX.4.2\0019=128="
514+
+ "FIX.4.2\0019=8=FIX.4.2\0019=12\00135=X\001108=30\00110=049\001");
515+
MessageDecoderResult decoderResult = decoder.decode(null, buffer, decoderOutput);
516+
assertEquals("wrong decoder result", MessageDecoderResult.OK, decoderResult);
517+
assertEquals("Wrong encoding", 14397, (int) decoderOutput.getMessage().charAt(0));
518+
}
493519
}

0 commit comments

Comments
 (0)