diff options
author | Josh Gao <jmgao@google.com> | 2017-09-26 14:11:37 -0700 |
---|---|---|
committer | Josh Gao <jmgao@google.com> | 2017-11-15 15:38:13 -0800 |
commit | 29c5378e91720b7befabc91fbab0f25d59a23bf1 (patch) | |
tree | bbbad7bd899927a5e6f9e15891be0e4de31fc7c4 /libunwindstack/tests/MemoryLocalTest.cpp | |
parent | 37eb97d911087992fb7dc986331e10a3c5a18d30 (diff) |
unwindstack: add Memory::ReadPartially.
Add a way to read while allowing for partial reads.
Test: new tests added to libunwindstack_test, ran 32/64 on hikey960, sailfish
Test: ran unwind on hikey960/sailfish
Change-Id: I8b11d9230fcd3122148ef3f980863ac1404ad70a
Diffstat (limited to 'libunwindstack/tests/MemoryLocalTest.cpp')
-rw-r--r-- | libunwindstack/tests/MemoryLocalTest.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/libunwindstack/tests/MemoryLocalTest.cpp b/libunwindstack/tests/MemoryLocalTest.cpp index 73eebdd8c..957b239a6 100644 --- a/libunwindstack/tests/MemoryLocalTest.cpp +++ b/libunwindstack/tests/MemoryLocalTest.cpp @@ -16,6 +16,7 @@ #include <stdint.h> #include <string.h> +#include <sys/mman.h> #include <vector> @@ -67,4 +68,44 @@ TEST(MemoryLocalTest, read_overflow) { ASSERT_FALSE(local.Read(reinterpret_cast<uint64_t>(&value), dst.data(), SIZE_MAX)); } +TEST(MemoryLocalTest, ReadPartially) { + char* mapping = static_cast<char*>( + mmap(nullptr, 2 * getpagesize(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + + ASSERT_NE(MAP_FAILED, mapping); + + mprotect(mapping + getpagesize(), getpagesize(), PROT_NONE); + memset(mapping + getpagesize() - 1024, 0x4c, 1024); + + MemoryLocal local; + + std::vector<uint8_t> dst(4096); + ASSERT_EQ(1024U, local.ReadPartially(reinterpret_cast<uint64_t>(mapping + getpagesize() - 1024), + dst.data(), 4096)); + for (size_t i = 0; i < 1024; i++) { + ASSERT_EQ(0x4cU, dst[i]) << "Failed at byte " << i; + } + + ASSERT_EQ(0, munmap(mapping, 2 * getpagesize())); +} + +TEST(MemoryLocalTest, read_hole) { + void* mapping = + mmap(nullptr, 3 * 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + ASSERT_NE(MAP_FAILED, mapping); + memset(mapping, 0xFF, 3 * 4096); + mprotect(static_cast<char*>(mapping) + 4096, 4096, PROT_NONE); + + MemoryLocal local; + std::vector<uint8_t> dst(4096 * 3, 0xCC); + ASSERT_EQ(4096U, local.ReadPartially(reinterpret_cast<uintptr_t>(mapping), dst.data(), 4096 * 3)); + for (size_t i = 0; i < 4096; ++i) { + ASSERT_EQ(0xFF, dst[i]); + } + for (size_t i = 4096; i < 4096 * 3; ++i) { + ASSERT_EQ(0xCC, dst[i]); + } + ASSERT_EQ(0, munmap(mapping, 3 * 4096)); +} + } // namespace unwindstack |