diff options
| -rw-r--r-- | src/dex_file.cc | 4 | ||||
| -rw-r--r-- | src/mem_map.cc | 14 | ||||
| -rw-r--r-- | src/mem_map.h | 2 |
3 files changed, 17 insertions, 3 deletions
diff --git a/src/dex_file.cc b/src/dex_file.cc index f18b21556e..3ba671e23e 100644 --- a/src/dex_file.cc +++ b/src/dex_file.cc @@ -96,9 +96,7 @@ const DexFile* DexFile::Open(const std::string& filename, } void DexFile::ChangePermissions(int prot) const { - if (mprotect(mem_map_->Begin(), mem_map_->Size(), prot) != 0) { - PLOG(FATAL) << "Failed to change dex file permissions to " << prot << " for " << GetLocation(); - } + mem_map_->Protect(prot); } const DexFile* DexFile::OpenFile(const std::string& filename, diff --git a/src/mem_map.cc b/src/mem_map.cc index ba34d8b5f2..8201fa8fbe 100644 --- a/src/mem_map.cc +++ b/src/mem_map.cc @@ -223,4 +223,18 @@ MemMap::MemMap(byte* begin, size_t size, void* base_begin, size_t base_size) CHECK_NE(base_size_, 0U); }; + +bool MemMap::Protect(int prot) { + if (base_begin_ == NULL && base_size_ == 0) { + return true; + } + + if (mprotect(base_begin_, base_size_, prot) == 0) { + return true; + } + + PLOG(ERROR) << "mprotect(" << base_begin_ << ", " << base_size_ << ", " << prot << ") failed"; + return false; +} + } // namespace art diff --git a/src/mem_map.h b/src/mem_map.h index ce2f4fae96..87c45a9106 100644 --- a/src/mem_map.h +++ b/src/mem_map.h @@ -57,6 +57,8 @@ class MemMap { // Releases the memory mapping ~MemMap(); + bool Protect(int prot); + byte* Begin() const { return begin_; } |