From 127fad417b7ad6fe5d8b0d43b778b9fcae60999a Mon Sep 17 00:00:00 2001 From: Nitesh Kumar <166297874+niteshg97@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:24:57 +0530 Subject: [PATCH 1/3] Change tailOffset condition check in Parser.h --- Algorithm/include/Algorithm/Parser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Algorithm/include/Algorithm/Parser.h b/Algorithm/include/Algorithm/Parser.h index a2a7468621b4c..9e3ee2991711d 100644 --- a/Algorithm/include/Algorithm/Parser.h +++ b/Algorithm/include/Algorithm/Parser.h @@ -189,7 +189,7 @@ class ForwardParser entry.length = frameSize - totalOffset; // optionally extract and check trailer - if (tailOffset > 0) { + if (tailOffset == 0) { entry.trailer = nullptr; } else { auto trailerStart = buffer + position + frameSize - tailOffset; From 9fe6d79cb993e0abc0e1e4c1b1870260602a4acb Mon Sep 17 00:00:00 2001 From: Nitesh Kumar <166297874+niteshg97@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:45:45 +0530 Subject: [PATCH 2/3] Add regression tests for ForwardParser trailer validation --- Algorithm/test/parser.cxx | 57 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/Algorithm/test/parser.cxx b/Algorithm/test/parser.cxx index 0f31df99ca825..943a7e3d7650e 100644 --- a/Algorithm/test/parser.cxx +++ b/Algorithm/test/parser.cxx @@ -64,7 +64,9 @@ BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_trailer) auto checkHeader = [](const typename FrameT::HeaderType& header) { return header.identifier == 0xdeadbeef; }; - auto checkTrailer = [](const typename FrameT::TrailerType& trailer) { +int trailerCheckCount = 0; + auto checkTrailer = [&trailerCheckCount](const typename FrameT::TrailerType& trailer) { + ++trailerCheckCount; return trailer.identifier == 0xaaffee00; }; auto getFrameSize = [](const typename ParserT::HeaderType& header) { @@ -88,9 +90,62 @@ BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_trailer) BOOST_REQUIRE(result == 3); BOOST_REQUIRE(frames.size() == 3); + // verify the trailer check callback was actually invoked for each frame + BOOST_CHECK(trailerCheckCount == 3); + BOOST_CHECK(memcmp(frames[0].payload, "lotsofsillydata", frames[0].length) == 0); BOOST_CHECK(memcmp(frames[1].payload, "test", frames[1].length) == 0); BOOST_CHECK(memcmp(frames[2].payload, "dummydata", frames[2].length) == 0); + + // verify trailer pointers are valid and fields correctly extracted from the buffer + BOOST_REQUIRE(frames[0].trailer != nullptr); + BOOST_CHECK(frames[0].trailer->flags == 0xaa); + BOOST_REQUIRE(frames[1].trailer != nullptr); + BOOST_CHECK(frames[1].trailer->flags == 0xcc); + BOOST_REQUIRE(frames[2].trailer != nullptr); + BOOST_CHECK(frames[2].trailer->flags == 0x33); +} + +BOOST_AUTO_TEST_CASE(test_forwardparser_trailer_check_rejection) +{ + // verify that when checkTrailer returns false the parser reports a format error + using FrameT = o2::algorithm::Composite; + using TestFrame = o2::algorithm::StaticSequenceAllocator; + TestFrame tf(FrameT(16, "lotsofsillydata", 0xaa), + FrameT(5, "test", 0xcc), + FrameT(10, "dummydata", 0x33)); + + using ParserT = o2::algorithm::ForwardParser; + + auto checkHeader = [](const typename FrameT::HeaderType& header) { + return header.identifier == 0xdeadbeef; + }; + // reject the second frame by its flags value + auto checkTrailer = [](const typename FrameT::TrailerType& trailer) { + return trailer.flags != 0xcc; + }; + auto getFrameSize = [](const typename ParserT::HeaderType& header) { + return header.payloadSize + ParserT::totalOffset; + }; + + std::vector frames; + auto insert = [&frames](typename ParserT::FrameInfo& info) { + frames.emplace_back(info); + return true; + }; + + ParserT parser; + auto result = parser.parse(tf.buffer.get(), tf.size(), + checkHeader, + checkTrailer, + getFrameSize, + insert); + + // the second frame's trailer is rejected, so parsing must signal a format error + BOOST_REQUIRE(result == -1); + // insert is only called for a fully consistent buffer, so frames must be empty + BOOST_CHECK(frames.empty()); } BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_void_trailer) From 6b5ed4405c041a6197b1d6f1f3cf71c8f4129527 Mon Sep 17 00:00:00 2001 From: Nitesh Kumar <166297874+niteshg97@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:29:54 +0530 Subject: [PATCH 3/3] Fix clang-format issue --- Algorithm/test/parser.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Algorithm/test/parser.cxx b/Algorithm/test/parser.cxx index 943a7e3d7650e..948fbb7efbf6f 100644 --- a/Algorithm/test/parser.cxx +++ b/Algorithm/test/parser.cxx @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_trailer) auto checkHeader = [](const typename FrameT::HeaderType& header) { return header.identifier == 0xdeadbeef; }; -int trailerCheckCount = 0; + int trailerCheckCount = 0; auto checkTrailer = [&trailerCheckCount](const typename FrameT::TrailerType& trailer) { ++trailerCheckCount; return trailer.identifier == 0xaaffee00;