diff --git a/lib/clif-backend/src/resolver.rs b/lib/clif-backend/src/resolver.rs index 224dc6e91..25b85b113 100644 --- a/lib/clif-backend/src/resolver.rs +++ b/lib/clif-backend/src/resolver.rs @@ -63,7 +63,7 @@ impl FuncResolverBuilder { .map_err(|e| CompileError::InternalError { msg: e.to_string() })?; unsafe { memory - .protect(0..memory.size(), Protect::ReadWrite) + .protect(.., Protect::ReadWrite) .map_err(|e| CompileError::InternalError { msg: e.to_string() })?; } @@ -179,7 +179,7 @@ impl FuncResolverBuilder { unsafe { self.resolver .memory - .protect(0..self.resolver.memory.size(), Protect::ReadExec) + .protect(.., Protect::ReadExec) .map_err(|e| CompileError::InternalError { msg: e.to_string() })?; } diff --git a/lib/clif-backend/src/trampoline.rs b/lib/clif-backend/src/trampoline.rs index e44bcde2c..562a49f6d 100644 --- a/lib/clif-backend/src/trampoline.rs +++ b/lib/clif-backend/src/trampoline.rs @@ -66,9 +66,7 @@ impl Trampolines { let mut memory = Memory::with_size(total_size).unwrap(); unsafe { - memory - .protect(0..memory.size(), Protect::ReadWrite) - .unwrap(); + memory.protect(.., Protect::ReadWrite).unwrap(); } // "\xCC" disassembles to "int3", which will immediately cause @@ -91,7 +89,7 @@ impl Trampolines { } unsafe { - memory.protect(0..memory.size(), Protect::ReadExec).unwrap(); + memory.protect(.., Protect::ReadExec).unwrap(); } Self { diff --git a/lib/runtime-core/src/sys/unix/memory.rs b/lib/runtime-core/src/sys/unix/memory.rs index 062dcba0d..6001bbfcf 100644 --- a/lib/runtime-core/src/sys/unix/memory.rs +++ b/lib/runtime-core/src/sys/unix/memory.rs @@ -1,7 +1,7 @@ use errno; use nix::libc; use page_size; -use std::ops::Range; +use std::ops::{Bound, RangeBounds}; use std::{ptr, slice}; #[derive(Debug)] @@ -42,13 +42,30 @@ impl Memory { } } - pub unsafe fn protect(&mut self, range: Range, protect: Protect) -> Result<(), String> { + pub unsafe fn protect( + &mut self, + range: impl RangeBounds, + protect: Protect, + ) -> Result<(), String> { let protect = protect.to_protect_const(); + + let range_start = match range.start_bound() { + Bound::Included(start) => *start, + Bound::Excluded(start) => *start, + Bound::Unbounded => 0, + }; + + let range_end = match range.end_bound() { + Bound::Included(end) => *end, + Bound::Excluded(end) => *end, + Bound::Unbounded => self.size(), + }; + let page_size = page_size::get(); let start = self .ptr - .add(round_down_to_page_size(range.start, page_size)); - let size = round_up_to_page_size(range.end - range.start, page_size); + .add(round_down_to_page_size(range_start, page_size)); + let size = round_up_to_page_size(range_end - range_start, page_size); assert!(size <= self.size); let success = libc::mprotect(start as _, size, protect as i32); diff --git a/lib/runtime-core/src/sys/windows/memory.rs b/lib/runtime-core/src/sys/windows/memory.rs index 971da9007..5a2a243b4 100644 --- a/lib/runtime-core/src/sys/windows/memory.rs +++ b/lib/runtime-core/src/sys/windows/memory.rs @@ -4,7 +4,7 @@ use winapi::um::memoryapi::{ PAGE_NOACCESS, PAGE_EXECUTE_READ, PAGE_READWRITE, PAGE_READONLY, }; use page_size; -use std::ops::Range; +use std::ops::{Bound, RangeBounds}; use std::{ptr, slice}; #[derive(Debug)] @@ -43,13 +43,26 @@ impl Memory { } } - pub unsafe fn protect(&mut self, range: Range, protect: Protect) -> Result<(), String> { + pub unsafe fn protect(&mut self, range: impl RangeBounds, protect: Protect) -> Result<(), String> { let protect = protect.to_protect_const(); + + let range_start = match range.start_bound() { + Bound::Included(start) => *start, + Bound::Excluded(start) => *start, + Bound::Unbounded => 0, + }; + + let range_end = match range.end_bound() { + Bound::Included(end) => *end, + Bound::Excluded(end) => *end, + Bound::Unbounded => self.size(), + }; + let page_size = page_size::get(); let start = self .ptr - .add(round_down_to_page_size(range.start, page_size)); - let size = round_up_to_page_size(range.end - range.start, page_size); + .add(round_down_to_page_size(range_start, page_size)); + let size = round_up_to_page_size(range_end - range_start, page_size); assert!(size <= self.size); // Commit the virtual memory.