summaryrefslogtreecommitdiff
path: root/libunwindstack/Memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libunwindstack/Memory.cpp')
-rw-r--r--libunwindstack/Memory.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/libunwindstack/Memory.cpp b/libunwindstack/Memory.cpp
index 29fc5cd..258c54a 100644
--- a/libunwindstack/Memory.cpp
+++ b/libunwindstack/Memory.cpp
@@ -228,21 +228,28 @@ std::shared_ptr<Memory> Memory::CreateOfflineMemory(const uint8_t* data, uint64_
}
size_t MemoryBuffer::Read(uint64_t addr, void* dst, size_t size) {
- if (addr >= size_) {
+ if (addr < offset_) {
+ return 0;
+ }
+ addr -= offset_;
+ size_t raw_size = raw_.size();
+ if (addr >= raw_size) {
return 0;
}
- size_t bytes_left = size_ - static_cast<size_t>(addr);
- const unsigned char* actual_base = static_cast<const unsigned char*>(raw_) + addr;
+ size_t bytes_left = raw_size - static_cast<size_t>(addr);
size_t actual_len = std::min(bytes_left, size);
-
- memcpy(dst, actual_base, actual_len);
+ memcpy(dst, &raw_[addr], actual_len);
return actual_len;
}
-uint8_t* MemoryBuffer::GetPtr(size_t offset) {
- if (offset < size_) {
- return &raw_[offset];
+uint8_t* MemoryBuffer::GetPtr(size_t addr) {
+ if (addr < offset_) {
+ return nullptr;
+ }
+ addr -= offset_;
+ if (addr < raw_.size()) {
+ return &raw_[addr];
}
return nullptr;
}