From 084f6f223847c7d69f669622ad765824469db777 Mon Sep 17 00:00:00 2001 From: jiangwei Date: Fri, 21 Mar 2025 10:23:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20memcpy=5Fs=E5=AE=89=E5=85=A8=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jiangwei --- src/perf_event_record.cpp | 12 ++--- src/spe_decoder.cpp | 10 +++- src/virtual_runtime.cpp | 4 +- .../common/native/perf_event_record_test.cpp | 50 +++++++++++++++++++ 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/perf_event_record.cpp b/src/perf_event_record.cpp index 7033948..cd4fc75 100644 --- a/src/perf_event_record.cpp +++ b/src/perf_event_record.cpp @@ -227,8 +227,8 @@ bool PerfRecordAuxtrace::GetBinary1(std::vector &buf) const uint8_t *p = buf.data() + GetHeaderSize(); size_t copySize = header_.size - GetHeaderSize(); - if (memcpy_s(p, sizeof(data_), reinterpret_cast(&data_), copySize) != 0) { - HLOGE("memcpy_s return failed"); + if (memcpy_s(p, buf.size() - GetHeaderSize(), reinterpret_cast(&data_), copySize) != 0) { + HLOGE("memcpy_s return failed in GetBinary1"); return false; } return true; @@ -244,13 +244,13 @@ bool PerfRecordAuxtrace::GetBinary(std::vector &buf) const uint8_t *p = buf.data() + GetHeaderSize(); size_t copySize = header_.size - GetHeaderSize(); - if (memcpy_s(p, sizeof(data_), reinterpret_cast(&data_), copySize) != 0) { - HLOGE("memcpy_s return failed"); + if (memcpy_s(p, buf.size() - GetHeaderSize(), reinterpret_cast(&data_), copySize) != 0) { + HLOGE("memcpy_s return failed in GetBinary with data_"); return false; } p += header_.size - GetHeaderSize(); - if (memcpy_s(p, data_.size, static_cast(rawData_), data_.size) != 0) { - HLOGE("memcpy_s return failed"); + if (memcpy_s(p, buf.size() - header_.size, static_cast(rawData_), data_.size) != 0) { + HLOGE("memcpy_s return failed in GetBinary with rawData_"); return false; } return true; diff --git a/src/spe_decoder.cpp b/src/spe_decoder.cpp index 01007f1..1fc6cc2 100644 --- a/src/spe_decoder.cpp +++ b/src/spe_decoder.cpp @@ -180,7 +180,10 @@ static int SpeDoGetPacket(const unsigned char *buf, size_t len, unsigned int hdr; unsigned char extHdr = 0; - memset_s(packet, sizeof(struct SpePkt), 0, sizeof(struct SpePkt)); + if (memset_s(packet, sizeof(struct SpePkt), 0, sizeof(struct SpePkt)) != EOK) { + HLOGE("memset_s failed in SpeDoGetPacket"); + return -1; + } if (!len) { return PERF_SPE_NEED_MORE_BYTES; @@ -669,7 +672,10 @@ static int SpeReadRecord(struct SpeDecoder *decoder) u64 payload; u64 ip; CHECK_TRUE(decoder == nullptr, -1, 1, "Invalid pointer!"); - memset_s(&decoder->record, sizeof(decoder->record), 0, sizeof(decoder->record)); + if (memset_s(&decoder->record, sizeof(decoder->record), 0, sizeof(decoder->record)) != EOK) { + HLOGE("memset_s failed in SpeReadRecord."); + return -1; + } decoder->record.context_id = (u64)-1; while (true) { diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index c362410..62a0ab9 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -1402,7 +1402,9 @@ void VirtualRuntime::FixHMBundleMmap(char *filename, int pid, u16 &headerSize) VirtualThread &thread = GetThread(pid, pid); if (NeedAdaptHMBundlePath(newFilename, thread.name_)) { size_t oldSize = strlen(filename); - (void)memset_s(filename, KILO, '\0', KILO); + if (memset_s(filename, KILO, '\0', KILO) != EOK) { + HLOGD("memset_s failed in FixHMBundleMmap."); + } if (strncpy_s(filename, KILO, newFilename.c_str(), newFilename.size()) != 0) { HLOGD("strncpy_s recordMmap2 failed!"); } diff --git a/test/unittest/common/native/perf_event_record_test.cpp b/test/unittest/common/native/perf_event_record_test.cpp index c580b9c..a237889 100644 --- a/test/unittest/common/native/perf_event_record_test.cpp +++ b/test/unittest/common/native/perf_event_record_test.cpp @@ -1159,6 +1159,56 @@ HWTEST_F(PerfEventRecordTest, AuxtraceInit, TestSize.Level1) free(p); } +HWTEST_F(PerfEventRecordTest, GetBinary1, TestSize.Level1) +{ + const char* rawData = "rawData"; + size_t len = strlen(rawData) + 1; + perf_event_header header; + header.size = sizeof(PerfRecordAuxtraceData) + sizeof(perf_event_header); + header.type = PERF_RECORD_AUXTRACE; + header.misc = PERF_RECORD_MISC_USER; + PerfRecordAuxtraceData data; + data.cpu = 1; + data.idx = 1; + data.offset = 2; + data.reference = 2; + data.reserved__ = 2; + data.size = 1; + data.tid = 1; + uint8_t* p = static_cast(malloc(header.size + len)); + EXPECT_EQ(memset_s(p, header.size + len, 0, header.size + len), 0); + if (memcpy_s(p, sizeof(perf_event_header), reinterpret_cast(&header), + sizeof(perf_event_header)) != 0) { + printf("memcpy_s perf_event_header return failed"); + } + if (memcpy_s(p + sizeof(perf_event_header), sizeof(PerfRecordAuxtraceData), + reinterpret_cast(&data), sizeof(PerfRecordAuxtraceData)) != 0) { + printf("memcpy_s data return failed"); + } + if (memcpy_s(p + header.size, len, reinterpret_cast(rawData), len) != 0) { + printf("memcpy_s rawData return failed"); + } + PerfRecordAuxtrace record; + PerfRecordAuxtrace recordCopy; + record.Init(p); + std::vector buf; + ASSERT_TRUE(record.GetBinary1(buf)); + EXPECT_LT(buf.size(), record.GetSize()); + ASSERT_EQ(CompareByteStream(p, buf.data(), buf.size()), 0); + recordCopy.Init(buf.data()); + EXPECT_EQ(recordCopy.header_.type, PERF_RECORD_AUXTRACE); + EXPECT_EQ(recordCopy.header_.misc, PERF_RECORD_MISC_USER); + EXPECT_EQ(recordCopy.header_.size, sizeof(PerfRecordAuxtraceData) + sizeof(perf_event_header)); + EXPECT_EQ(recordCopy.data_.size, 1); + EXPECT_EQ(recordCopy.data_.offset, 2); + EXPECT_EQ(recordCopy.data_.reference, 2); + EXPECT_EQ(recordCopy.data_.idx, 1); + EXPECT_EQ(recordCopy.data_.tid, 1); + EXPECT_EQ(recordCopy.data_.cpu, 1); + EXPECT_EQ(recordCopy.data_.reserved__, 2); + free(p); +} + HWTEST_F(PerfEventRecordTest, AuxtraceInitErr, TestSize.Level1) { perf_event_header header; -- Gitee