diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp index 8e70920a24d2692b2742f6410a26f44ee670584f..5b3045f14b2e9d578040db1260a16a6c788a9f04 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp @@ -611,6 +611,9 @@ bool FtraceProcessor::HandlePage(FtraceCpuDetailMsg &cpuMsg, cpuMsg.set_overwrite(curPageHeader_.overwrite); curTimestamp_ = curPageHeader_.timestamp; endPosOfData_ = curPageHeader_.endpos; + if (endPosOfData_ > endPosOfPage_) { + return false; + } while (curPos_ < curPageHeader_.endpos) { FtraceEventHeader eventHeader = {}; TS_CHECK_TRUE(ReadInfo(&curPos_, endPosOfData_, &eventHeader, sizeof(FtraceEventHeader)), false, @@ -659,6 +662,9 @@ void FtraceProcessor::HmProcessPageTraceDataEvents(RmqConsumerData *rmqData, EventFormat format = {}; auto curPtr = rmqData->data; auto endPtr = rmqData->data + rmqData->length; + if (rmqData->length > DATA_SIZE) { + return; + } while (curPtr < endPtr) { event = (struct RmqEntry *)curPtr; auto evtSize = event->size; diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h index f5d059994130d390878024071a60f09de6afe37f..3ea9aff77f65d3c6973bc6f7ce212ac2bdb81a9b 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h @@ -29,6 +29,8 @@ namespace SysTuning { namespace TraceStreamer { using namespace SysTuning::base; constexpr uint32_t FTRACE_PAGE_SIZE = 4096; +// DATA_SIZE = FTRACE_PAGE_SIZE - RmqConsumerData.timestamp-RmqConsumerData.length-RmqConsumerData.coreId所占的长度 +constexpr uint32_t DATA_SIZE = 4079; constexpr uint32_t RMQ_ENTRY_ALIGN_MASK = (1 << 2) - 1; class FtraceProcessor { public: diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp index bc7e3cf0316b0e9b6fe7c355cd5c9bff7710d10c..496480eb88b58cf9495d4c6611907c764baebcd2 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp @@ -286,8 +286,8 @@ bool RawTraceParser::ParseDataRecursively(std::deque::iterator &package packagesCurIter += sizeof(type); std::copy(packagesCurIter, packagesCurIter + sizeof(len), reinterpret_cast(&len)); packagesCurIter += sizeof(len); - uint32_t restDataLen = std::distance(packagesCurIter, packagesBuffer_.end()); - TS_CHECK_TRUE_RET(len <= restDataLen && packagesBuffer_.size() > 0, false); + int32_t restDataLen = std::distance(packagesCurIter, packagesBuffer_.end()); + TS_CHECK_TRUE_RET(restDataLen >= 0 && len <= restDataLen && packagesBuffer_.size() > 0, false); std::string bufferLine(packagesCurIter, packagesCurIter + len); packagesCurIter += len; packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter);