From 47bd8ade6db00d82819cb88af479adb684c77cd2 Mon Sep 17 00:00:00 2001 From: Dirk Hutter Date: Tue, 19 Mar 2019 19:43:41 +0100 Subject: [PATCH 1/2] Bugfix in FlibPatternChecker trusting in potential errornous size info. --- lib/fles_core/FlibPatternChecker.cpp | 31 +++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/fles_core/FlibPatternChecker.cpp b/lib/fles_core/FlibPatternChecker.cpp index 6134435ee..ab18f63d8 100644 --- a/lib/fles_core/FlibPatternChecker.cpp +++ b/lib/fles_core/FlibPatternChecker.cpp @@ -21,19 +21,34 @@ bool FlibPatternChecker::check(const fles::Microslice& m) { ++flib_pgen_packet_number_; } - // Do not check last word size and last word if ms was truncated - // Last word check will be skipped because last_word_size = 0 - if (m.desc().size >= 1 && - ((m.desc().flags & - static_cast(fles::MicrosliceFlags::OverflowFlim)) == 0)) { + if (m.desc().size >= 1) { last_word_size = m.content()[0]; - if ((m.desc().size & 0x7) != (last_word_size & 0x7)) { - std::cerr << "Flib pgen: error in last word size" << std::endl; - std::cerr << "desc.size " << m.desc().size << std::endl; + // Assert last word size is in valid range form 0 to 8 bytes + if (last_word_size > 8) { + std::cerr << "Flib pgen: error in last word size: out of bounds" + << std::endl; std::cerr << "last word " << static_cast(last_word_size) << std::endl; + last_word_size = 0; return false; } + // Do not check last word size consistency and last word content if ms was + // truncated + if ((m.desc().flags & + static_cast(fles::MicrosliceFlags::OverflowFlim)) == 0) { + if ((m.desc().size & 0x7) != (last_word_size & 0x7)) { + std::cerr + << "Flib pgen: error in last word size: inconsistent with desc.size" + << std::endl; + std::cerr << "desc.size " << m.desc().size << std::endl; + std::cerr << "last word " << static_cast(last_word_size) + << std::endl; + return false; + } + } else { + // if truncated set to 0 to skip last word content check at the end + last_word_size = 0; + } } if (m.desc().size >= 4) { From 5280f4d90ad9af6d05277b797d7c095b4c5c7d30 Mon Sep 17 00:00:00 2001 From: Dirk Hutter Date: Tue, 19 Mar 2019 20:01:55 +0100 Subject: [PATCH 2/2] Correctly flush output in case of dumps. --- lib/fles_core/MicrosliceAnalyzer.cpp | 2 +- lib/fles_core/TimesliceAnalyzer.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/fles_core/MicrosliceAnalyzer.cpp b/lib/fles_core/MicrosliceAnalyzer.cpp index a5bd94022..0e579b210 100644 --- a/lib/fles_core/MicrosliceAnalyzer.cpp +++ b/lib/fles_core/MicrosliceAnalyzer.cpp @@ -111,7 +111,7 @@ bool MicrosliceAnalyzer::check_microslice(const fles::Microslice& ms) { out_verbosity_ >= 3) { // full dump for first error out_ << "microslice content:\n" << MicrosliceDescriptorDump(ms.desc()) - << BufferDump(ms.content(), ms.desc().size); + << BufferDump(ms.content(), ms.desc().size) << std::flush; } ++microslice_error_count_; } diff --git a/lib/fles_core/TimesliceAnalyzer.cpp b/lib/fles_core/TimesliceAnalyzer.cpp index 728faf0fe..6621d427e 100644 --- a/lib/fles_core/TimesliceAnalyzer.cpp +++ b/lib/fles_core/TimesliceAnalyzer.cpp @@ -133,7 +133,8 @@ bool TimesliceAnalyzer::check_timeslice(const fles::Timeslice& ts) { out_ << "microslice content:\n" << MicrosliceDescriptorDump(ts.get_microslice(c, m).desc()) << BufferDump(ts.get_microslice(c, m).content(), - ts.get_microslice(c, m).desc().size); + ts.get_microslice(c, m).desc().size) + << std::flush; } ++timeslice_error_count_; return false;