From 8ea0bb4f1c6071f9c9fc2f1181b141182e360676 Mon Sep 17 00:00:00 2001 From: Roman-Koshelev Date: Sun, 11 Apr 2021 13:15:24 +0300 Subject: [PATCH 1/2] Fix next_message_reader() method According to the comment, the function must return a valid message (although not necessarily complete). This is logical, but not so now. Also, now, in the absence of a valid message, we will return a zero-size reader pointing to the last byte --- include/hffix.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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_); From 77c607ecc25b298256c5cae1bac94662ba2bdaf8 Mon Sep 17 00:00:00 2001 From: Roman-Koshelev Date: Sun, 11 Apr 2021 13:15:30 +0300 Subject: [PATCH 2/2] Add new test --- test/expected/writer01.fix | Bin 241 -> 275 bytes test/src/reader01.cpp | 4 ++-- test/src/writer01.cpp | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/expected/writer01.fix b/test/expected/writer01.fix index f7dd6d853efdba5628e35cae57826f1e8bc5430d..f12ae3cc0897c9cff0500fbb537d155f0339313f 100644 GIT binary patch delta 41 bcmey!IGIUFPft(5!q&|*LIDShVZuiM&teKE delta 7 OcmbQt^pSC*(nkObxdSW! 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.