diff --git a/.github/workflows/kernel.yml b/.github/workflows/kernel.yml index 9ff04ba..32c18fe 100644 --- a/.github/workflows/kernel.yml +++ b/.github/workflows/kernel.yml @@ -39,6 +39,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: ${{ env.GIT_EXIT_CODE }} != 0 with: + author: "zshipko " title: "update(kernel): extism-runtime.wasm in ${{ github.event.pull_request.head.ref }}" body: "Automated PR to update `runtime/src/extism-runtime.wasm` in PR #${{ github.event.number }}" base: "${{ github.event.pull_request.head.ref }}" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 868720c..492eaa6 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" [dependencies] +[dev-dependencies] +wasm-bindgen-test = "0.3.39" + [features] default = ["bounds-checking"] bounds-checking = [] diff --git a/kernel/src/bin/extism-runtime.rs b/kernel/src/bin/extism-runtime.rs index 7db9667..dc39a4a 100644 --- a/kernel/src/bin/extism-runtime.rs +++ b/kernel/src/bin/extism-runtime.rs @@ -3,7 +3,7 @@ pub use extism_runtime_kernel::*; -#[cfg(target_arch = "wasm32")] +#[cfg(all(target_arch = "wasm32", not(test)))] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { core::arch::wasm32::unreachable() diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 368fdbe..f8f1d93 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -228,7 +228,7 @@ impl MemoryRoot { if status == MemoryStatus::Free as u8 && b.size >= length as usize { // Split block if there is too much excess if b.size - length as usize >= 128 { - b.size -= length as usize; + b.size -= length as usize + core::mem::size_of::(); b.used = 0; let block1 = b.data.as_mut_ptr().add(b.size) as *mut MemoryBlock; @@ -574,3 +574,48 @@ pub unsafe fn error_get() -> Handle { pub unsafe fn memory_bytes() -> u64 { MemoryRoot::new().length.load(Ordering::Acquire) } + +#[cfg(test)] +mod test { + use crate::*; + use wasm_bindgen_test::*; + + // See https://github.com/extism/extism/pull/659 + #[wasm_bindgen_test] + fn test_659() { + unsafe { + // Warning: These offsets will need to change if we adjust the kernel memory layout at all + reset(); + assert_eq!(alloc(1065), 77); + assert_eq!(alloc(288), 1154); + assert_eq!(alloc(128), 1454); + assert_eq!(length(1154), 288); + assert_eq!(length(1454), 128); + free(1454); + assert_eq!(alloc(213), 1594); + length_unsafe(1594); + assert_eq!(alloc(511), 1819); + assert_eq!(alloc(4), 1454); + assert_eq!(length(1454), 4); + assert_eq!(length(1819), 511); + assert_eq!(alloc(13), 2342); + assert_eq!(length(2342), 13); + assert_eq!(alloc(336), 2367); + assert_eq!(alloc(1077), 2715); + assert_eq!(length(2367), 336); + assert_eq!(length(2715), 1077); + free(2715); + assert_eq!(alloc(1094), 3804); + length_unsafe(3804); + + // Allocate 4 bytes, expect to receive address 3788 + assert_eq!(alloc(4), 3788); + + assert_eq!(alloc(4), 3772); + assert_eq!(length(3772), 4); + + // Address 3788 has not been freed yet, so expect it to have 4 bytes allocated + assert_eq!(length(3788), 4); + } + } +} diff --git a/kernel/test.sh b/kernel/test.sh new file mode 100755 index 0000000..785db3e --- /dev/null +++ b/kernel/test.sh @@ -0,0 +1,5 @@ +# install wasm-bindgen-cli to get wasm-bindgen-runner if it is not installed yet +which wasm-bindgen-test-runner 1>/dev/null || cargo install -f wasm-bindgen-cli + +# run tests with the wasm-bindgen-runner +CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER=wasm-bindgen-test-runner cargo test --release --target=wasm32-unknown-unknown diff --git a/runtime/src/extism-runtime.wasm b/runtime/src/extism-runtime.wasm index e36ea42..27b3220 100755 Binary files a/runtime/src/extism-runtime.wasm and b/runtime/src/extism-runtime.wasm differ