diff --git a/include/hffix.hpp b/include/hffix.hpp index 4668cfc..fdd4cd6 100644 --- a/include/hffix.hpp +++ b/include/hffix.hpp @@ -2069,11 +2069,13 @@ class message_reader { if (!is_valid_) { // this message isn't valid, so we have to try to search for the beginning of the next message. char const* b = buffer_ + 1; while(b < buffer_end_ - 10) { - if (!std::memcmp(b, "8=FIX", 5)) - break; + if (!std::memcmp(b, "8=FIX", 5)) { + message_reader tmp(b, buffer_end_); + if (tmp.is_valid()) return tmp; + } ++b; } - return message_reader(b, buffer_end_); + return message_reader(buffer_end_, buffer_end_); } return message_reader(end_.current_.value_.end_ + 1, buffer_end_); diff --git a/test/expected/writer01.fix b/test/expected/writer01.fix index f7dd6d8..f12ae3c 100644 Binary files a/test/expected/writer01.fix and b/test/expected/writer01.fix differ diff --git a/test/src/reader01.cpp b/test/src/reader01.cpp index f6848ef..c38eac1 100644 --- a/test/src/reader01.cpp +++ b/test/src/reader01.cpp @@ -37,7 +37,7 @@ int main(int argc, char** argv) hffix::message_reader reader(buffer, buffer + buffer_length); // Try to read as many complete messages as there are in the buffer. - for (; reader.is_complete(); reader = reader.next_message_reader()) { + for (int i = 0; reader.is_complete(); reader = reader.next_message_reader(), ++i) { if (reader.is_valid()) { // Here is a complete message. Read fields out of the reader. @@ -98,7 +98,7 @@ int main(int argc, char** argv) std::cerr << "Error reading fields: " << ex.what() << '\n'; } - } else { + } else if (i != 0) { // An invalid, corrupted FIX message. Do not try to read fields // out of this reader. The beginning of the invalid message is // at location reader.message_begin() in the buffer, but the diff --git a/test/src/writer01.cpp b/test/src/writer01.cpp index c90d305..460ec93 100644 --- a/test/src/writer01.cpp +++ b/test/src/writer01.cpp @@ -16,8 +16,11 @@ int main(int argc, char** argv) ptime tsend(date(2017,8,9), time_duration(12,34,56)); + char some_data[] = "... 8=FIX ... 8=FIX ... 8=FIX ..."; + memcpy(buffer, some_data, sizeof(some_data)); + // We'll put a FIX Logon message in the buffer. - hffix::message_writer logon(buffer, buffer + sizeof(buffer)); + hffix::message_writer logon(buffer + sizeof(some_data), buffer + sizeof(buffer)); logon.push_back_header("FIX.4.2"); // Write BeginString and BodyLength.