From 0f52cbfd19cd273e229fbd37e5a5811679c313bc Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Mon, 24 Feb 2025 09:55:42 +0800 Subject: [PATCH 1/2] check record size Signed-off-by: yuyanqinghw --- interfaces/innerkits/native/src/hiperf_client.cpp | 14 +------------- src/perf_events.cpp | 1 + src/perf_file_reader.cpp | 2 +- src/perf_file_writer.cpp | 8 +++++++- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/interfaces/innerkits/native/src/hiperf_client.cpp b/interfaces/innerkits/native/src/hiperf_client.cpp index a946985..cc263d4 100644 --- a/interfaces/innerkits/native/src/hiperf_client.cpp +++ b/interfaces/innerkits/native/src/hiperf_client.cpp @@ -341,26 +341,14 @@ Client::Client(const std::string &outputDir) bool Client::Setup(std::string outputDir) { - std::string CurrentCommandPath = CURRENT_PATH + HIPERF_COMMAND_NAME; std::string SystemCommandPath = SYSTEM_BIN_PATH + HIPERF_COMMAND_NAME; - std::string TempCommandPath = TempBinPath + HIPERF_COMMAND_NAME; if (!outputDir.empty() && outputDir.back() != '/') { outputDir.push_back('/'); } HIPERF_HILOGI(MODULE_CPP_API, "outputDir setup to %" HILOG_PUBLIC "s\n", outputDir.c_str()); - // found command path - if (access(SystemCommandPath.c_str(), X_OK) == 0) { - executeCommandPath_ = SystemCommandPath; - } else if (access(TempCommandPath.c_str(), X_OK) == 0) { - executeCommandPath_ = TempCommandPath; - } else if (access(CurrentCommandPath.c_str(), X_OK) == 0) { - executeCommandPath_ = CurrentCommandPath; - } else { - HIPERF_HILOGI(MODULE_CPP_API, "no hiperf command found\n"); - return ready_; - } + executeCommandPath_ = SystemCommandPath; // check output path // found command path diff --git a/src/perf_events.cpp b/src/perf_events.cpp index 39ca41b..8bfb964 100644 --- a/src/perf_events.cpp +++ b/src/perf_events.cpp @@ -617,6 +617,7 @@ bool PerfEvents::PrepareRecordThread() recordBuf_ = std::make_unique(CalcBufferSize()); } catch (const std::exception &e) { printf("create record buffer(size %zu) failed: %s\n", CalcBufferSize(), e.what()); + HIPERF_HILOGI(MODULE_DEFAULT, "create record buffer failed: %{public}s", e.what()); return false; } readRecordThreadRunning_ = true; diff --git a/src/perf_file_reader.cpp b/src/perf_file_reader.cpp index 34fa4a5..317a27d 100644 --- a/src/perf_file_reader.cpp +++ b/src/perf_file_reader.cpp @@ -267,7 +267,7 @@ bool PerfFileReader::ReadRecord(ProcessRecordCB &callback) if (header == nullptr) { HLOGE("read record header is null"); return false; - } else if (header->size > RECORD_SIZE_LIMIT) { + } else if (header->size > RECORD_SIZE_LIMIT || header->size < sizeof(perf_event_header)) { HLOGE("read record header size error %hu", header->size); return false; } diff --git a/src/perf_file_writer.cpp b/src/perf_file_writer.cpp index 4ee08e0..6cbc79f 100644 --- a/src/perf_file_writer.cpp +++ b/src/perf_file_writer.cpp @@ -171,7 +171,13 @@ bool PerfFileWriter::ReadRecords(ProcessRecordCB &callback) return false; } else { perf_event_header *header = reinterpret_cast(buf); - HLOG_ASSERT(header->size < RECORD_SIZE_LIMIT); + if (header == nullptr) { + HLOGE("read record header is null"); + return false; + } else if (header->size > RECORD_SIZE_LIMIT || header->size < sizeof(perf_event_header)) { + HLOGE("read record header size error %hu", header->size); + return false; + } if (remainingSize >= header->size) { size_t headerSize = sizeof(perf_event_header); if (Read(buf + headerSize, header->size - headerSize)) { -- Gitee From 140bf47e0397b9975853262bc59355677ad7e6e2 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Tue, 25 Feb 2025 09:09:21 +0800 Subject: [PATCH 2/2] check record size Signed-off-by: yuyanqinghw --- src/perf_file_writer.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/perf_file_writer.cpp b/src/perf_file_writer.cpp index 6cbc79f..1573d47 100644 --- a/src/perf_file_writer.cpp +++ b/src/perf_file_writer.cpp @@ -171,10 +171,7 @@ bool PerfFileWriter::ReadRecords(ProcessRecordCB &callback) return false; } else { perf_event_header *header = reinterpret_cast(buf); - if (header == nullptr) { - HLOGE("read record header is null"); - return false; - } else if (header->size > RECORD_SIZE_LIMIT || header->size < sizeof(perf_event_header)) { + if (header->size > RECORD_SIZE_LIMIT || header->size < sizeof(perf_event_header)) { HLOGE("read record header size error %hu", header->size); return false; } -- Gitee