Fix access to VMMemoryDefinition::current_length on big-endian (#3013)
The current_length member is defined as "usize" in Rust code, but generated wasm code refers to it as if it were "u32". While this happens to mostly work on little-endian machines (as long as the length is < 4GB), it will always fail on big-endian machines. Fixed by making current_length "u32" in Rust as well, and ensuring the actual memory size is always less than 4GB.
This commit is contained in:
@@ -318,7 +318,7 @@ impl Memory {
|
||||
unsafe {
|
||||
let store = store.into();
|
||||
let definition = *store[self.0].definition;
|
||||
slice::from_raw_parts(definition.base, definition.current_length)
|
||||
slice::from_raw_parts(definition.base, definition.current_length as usize)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,7 +334,7 @@ impl Memory {
|
||||
unsafe {
|
||||
let store = store.into();
|
||||
let definition = *store[self.0].definition;
|
||||
slice::from_raw_parts_mut(definition.base, definition.current_length)
|
||||
slice::from_raw_parts_mut(definition.base, definition.current_length as usize)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -395,7 +395,7 @@ impl Memory {
|
||||
///
|
||||
/// Panics if this memory doesn't belong to `store`.
|
||||
pub fn data_size(&self, store: impl AsContext) -> usize {
|
||||
unsafe { (*store.as_context()[self.0].definition).current_length }
|
||||
unsafe { (*store.as_context()[self.0].definition).current_length as usize }
|
||||
}
|
||||
|
||||
/// Returns the size, in WebAssembly pages, of this wasm memory.
|
||||
|
||||
@@ -7,6 +7,7 @@ use wasmtime_environ::entity::PrimaryMap;
|
||||
use wasmtime_environ::{wasm, MemoryPlan, MemoryStyle, Module, WASM_PAGE_SIZE};
|
||||
use wasmtime_runtime::{RuntimeLinearMemory, RuntimeMemoryCreator, VMMemoryDefinition};
|
||||
|
||||
use std::convert::TryFrom;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub fn create_memory(store: &mut StoreOpaque<'_>, memory: &MemoryType) -> Result<InstanceId> {
|
||||
@@ -48,7 +49,8 @@ impl RuntimeLinearMemory for LinearMemoryProxy {
|
||||
fn vmmemory(&self) -> VMMemoryDefinition {
|
||||
VMMemoryDefinition {
|
||||
base: self.mem.as_ptr(),
|
||||
current_length: self.mem.size() as usize * WASM_PAGE_SIZE as usize,
|
||||
current_length: u32::try_from(self.mem.size() as usize * WASM_PAGE_SIZE as usize)
|
||||
.unwrap(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user