Avoid creating slices with null pointers.
This commit is contained in:
@@ -56,6 +56,7 @@ impl MemoryStyle {
|
|||||||
if maximum <= tunables.static_memory_bound {
|
if maximum <= tunables.static_memory_bound {
|
||||||
// A heap with a declared maximum can be immovable, so make
|
// A heap with a declared maximum can be immovable, so make
|
||||||
// it static.
|
// it static.
|
||||||
|
assert!(tunables.static_memory_bound >= memory.minimum);
|
||||||
return (
|
return (
|
||||||
MemoryStyle::Static {
|
MemoryStyle::Static {
|
||||||
bound: tunables.static_memory_bound,
|
bound: tunables.static_memory_bound,
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ impl CodeMemory {
|
|||||||
self.position = 0;
|
self.position = 0;
|
||||||
|
|
||||||
for m in &mut self.mmaps[self.published..] {
|
for m in &mut self.mmaps[self.published..] {
|
||||||
if !m.as_ptr().is_null() {
|
if m.len() != 0 {
|
||||||
unsafe {
|
unsafe {
|
||||||
region::protect(m.as_mut_ptr(), m.len(), region::Protection::ReadExecute)
|
region::protect(m.as_mut_ptr(), m.len(), region::Protection::ReadExecute)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ impl LinearMemory {
|
|||||||
|
|
||||||
if new_bytes > self.mmap.len() - self.offset_guard_size {
|
if new_bytes > self.mmap.len() - self.offset_guard_size {
|
||||||
// If we have no maximum, this is a "dynamic" heap, and it's allowed to move.
|
// If we have no maximum, this is a "dynamic" heap, and it's allowed to move.
|
||||||
assert!(self.maximum.is_none());
|
|
||||||
let guard_bytes = self.offset_guard_size;
|
let guard_bytes = self.offset_guard_size;
|
||||||
let request_bytes = new_bytes.checked_add(guard_bytes)?;
|
let request_bytes = new_bytes.checked_add(guard_bytes)?;
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,11 @@ pub struct Mmap {
|
|||||||
impl Mmap {
|
impl Mmap {
|
||||||
/// Construct a new empty instance of `Mmap`.
|
/// Construct a new empty instance of `Mmap`.
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
|
// Rust's slices require non-null pointers, even when empty. `Vec`
|
||||||
|
// contains code to create a non-null dangling pointer value when
|
||||||
|
// constructed empty, so we reuse that here.
|
||||||
Self {
|
Self {
|
||||||
ptr: ptr::null_mut(),
|
ptr: Vec::new().as_mut_ptr(),
|
||||||
len: 0,
|
len: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,7 +122,7 @@ impl Mmap {
|
|||||||
impl Drop for Mmap {
|
impl Drop for Mmap {
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if !self.ptr.is_null() {
|
if self.len != 0 {
|
||||||
let r = unsafe { libc::munmap(self.ptr as *mut libc::c_void, self.len) };
|
let r = unsafe { libc::munmap(self.ptr as *mut libc::c_void, self.len) };
|
||||||
assert_eq!(r, 0, "munmap failed: {}", errno::errno());
|
assert_eq!(r, 0, "munmap failed: {}", errno::errno());
|
||||||
}
|
}
|
||||||
@@ -127,7 +130,7 @@ impl Drop for Mmap {
|
|||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if !self.ptr.is_null() {
|
if self.len != 0 {
|
||||||
use winapi::um::memoryapi::VirtualFree;
|
use winapi::um::memoryapi::VirtualFree;
|
||||||
use winapi::um::winnt::MEM_RELEASE;
|
use winapi::um::winnt::MEM_RELEASE;
|
||||||
let r = unsafe { VirtualFree(self.ptr as *mut libc::c_void, self.len, MEM_RELEASE) };
|
let r = unsafe { VirtualFree(self.ptr as *mut libc::c_void, self.len, MEM_RELEASE) };
|
||||||
|
|||||||
Reference in New Issue
Block a user