diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d9637dff..792c7242 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,10 +187,11 @@ jobs: unit_tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: "recursive" - name: setup_tests shell: bash run: | - cargo install cargo-script && cargo script tools/setup_test.rs && git diff --no-ext-diff --quiet + cargo install rust-script && rust-script tools/setup_test.rs && git diff --no-ext-diff --quiet + \ No newline at end of file diff --git a/src/as_execution/abi.rs b/src/as_execution/abi.rs index d38a58e4..e948c8a9 100644 --- a/src/as_execution/abi.rs +++ b/src/as_execution/abi.rs @@ -1544,18 +1544,14 @@ pub fn assembly_script_abort( line: i32, col: i32, ) -> ABIResult<()> { - let memory = ctx - .data() - .get_ffi_env() - .memory - .as_ref() - .expect("Failed to get memory on env") - .clone(); + let env = ctx.data(); + let memory = get_memory!(env); + let message_ = message - .read(&memory, &ctx) + .read(memory, &ctx) .map_err(|e| wasmer::RuntimeError::new(e.to_string())); let filename_ = filename - .read(&memory, &ctx) + .read(memory, &ctx) .map_err(|e| wasmer::RuntimeError::new(e.to_string())); if message_.is_err() || filename_.is_err() { diff --git a/src/tests/tests_runtime.rs b/src/tests/tests_runtime.rs index f17b8fff..c191a1f2 100644 --- a/src/tests/tests_runtime.rs +++ b/src/tests/tests_runtime.rs @@ -920,6 +920,43 @@ fn test_class_id() { assert_eq!(array_class_id, 4); } +#[test] +#[serial] +fn test_abort_does_not_panic() { + // AS source code for reference + // ```ts + //import { u256 } from 'as-bignum/assembly'; + //const test = u256.from('1982982'); + //export function main(_args: StaticArray): void { + //} + // ``` + // The above code fails in the start method, causing wasmer to abort the + // initialization of the module, hence returning memory as None that caused + // a panic + + let interface: Box = Box::new(TestInterface); + let bytecode = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/wasm/abort_crash.wasm" + )); + + let module = ASModule::new(bytecode, 100_000, GasCosts::default(), Compiler::SP).unwrap(); + let mut store = Store::new(module._engine); + let mut context = ASContext::new(&*interface, module.binary_module, GasCosts::default()); + let create_vm_instance_and_init_env = context.create_vm_instance_and_init_env(&mut store); + match create_vm_instance_and_init_env { + Ok(_) => { + panic!("Expected an error") + } + Err(e) => { + assert_eq!( + e.to_string(), + "RuntimeError: Runtime error: AssemblyScript memory is missing from the environment" + ) + } + } +} + #[cfg(feature = "execution-trace")] #[test] #[serial] diff --git a/wasm/abort_crash.wasm b/wasm/abort_crash.wasm new file mode 100644 index 00000000..f46d2bd5 Binary files /dev/null and b/wasm/abort_crash.wasm differ