From c24dd76c350b6880df5f1398f9a8fe0d1cff0948 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Thu, 10 Nov 2016 15:25:15 -0800 Subject: [PATCH] simpleperf: fix unaligned data access on arm. Bug: http://b/32340274 Test: run `simpleperf record --dump-symbols` manually. Test: run simpleperf_unit_test. Change-Id: I771a516bb644f18fafa987061ecfc76ae3521ca9 --- simpleperf/record_file_reader.cpp | 15 +++++---------- simpleperf/utils.h | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp index 786f1f44..bff8ba16 100644 --- a/simpleperf/record_file_reader.cpp +++ b/simpleperf/record_file_reader.cpp @@ -408,22 +408,17 @@ bool RecordFileReader::ReadFileFeature(size_t& read_pos, const char* p = buf.data(); *file_path = p; p += file_path->size() + 1; - memcpy(file_type, p, sizeof(uint32_t)); - p += sizeof(uint32_t); - memcpy(min_vaddr, p, sizeof(uint64_t)); - p += sizeof(uint64_t); + MoveFromBinaryFormat(*file_type, p); + MoveFromBinaryFormat(*min_vaddr, p); uint32_t symbol_count; - memcpy(&symbol_count, p, sizeof(uint32_t)); - p += sizeof(uint32_t); + MoveFromBinaryFormat(symbol_count, p); symbols->clear(); symbols->reserve(symbol_count); for (uint32_t i = 0; i < symbol_count; ++i) { uint64_t start_vaddr; uint32_t len; - memcpy(&start_vaddr, p, sizeof(uint64_t)); - p += sizeof(uint64_t); - memcpy(&len, p, sizeof(uint32_t)); - p += sizeof(uint32_t); + MoveFromBinaryFormat(start_vaddr, p); + MoveFromBinaryFormat(len, p); std::string name = p; p += name.size() + 1; symbols->emplace_back(name, start_vaddr, len); diff --git a/simpleperf/utils.h b/simpleperf/utils.h index 89962a66..fc21a99f 100644 --- a/simpleperf/utils.h +++ b/simpleperf/utils.h @@ -108,7 +108,7 @@ class ArchiveHelper { template void MoveFromBinaryFormat(T& data, const char*& p) { static_assert(std::is_standard_layout::value, "not standard layout"); - data = *reinterpret_cast(p); + memcpy(&data, p, sizeof(T)); p += sizeof(T); } @@ -123,7 +123,7 @@ void MoveFromBinaryFormat(T* data_p, size_t n, const char*& p) { template void MoveToBinaryFormat(const T& data, char*& p) { static_assert(std::is_standard_layout::value, "not standard layout"); - *reinterpret_cast(p) = data; + memcpy(p, &data, sizeof(T)); p += sizeof(T); } -- 2.11.0