diff options
Diffstat (limited to 'libunwindstack/Memory.cpp')
-rw-r--r-- | libunwindstack/Memory.cpp | 23 |
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; } |