From 22e6469fd0c700a5c76ab7459c707e1abdf9a60b Mon Sep 17 00:00:00 2001 From: Leonardo Yvens Date: Wed, 31 Mar 2021 11:34:12 -0300 Subject: [PATCH 1/2] runtime: Update wasmtime to 0.25 --- Cargo.lock | 259 +++++++++++++++------------- runtime/wasm/Cargo.toml | 2 +- runtime/wasm/src/mapping.rs | 6 +- runtime/wasm/src/module/mod.rs | 26 +-- runtime/wasm/src/module/test.rs | 27 ++- runtime/wasm/src/module/test/abi.rs | 32 ++-- 6 files changed, 193 insertions(+), 159 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f192ff6a7b5..c854260a95d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,7 +16,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423" dependencies = [ - "gimli 0.23.0", + "gimli", ] [[package]] @@ -138,9 +138,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.54" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2baad346b2d4e94a24347adeee9c7a93f412ee94b9cc26e5b59dea23848e9f28" +checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" dependencies = [ "addr2line", "cfg-if 1.0.0", @@ -551,6 +551,16 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +[[package]] +name = "cpp_demangle" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44919ecaf6f99e8e737bc239408931c9a01e9a6c74814fee8242dd2506b65390" +dependencies = [ + "cfg-if 1.0.0", + "glob", +] + [[package]] name = "cpuid-bool" version = "0.1.2" @@ -559,38 +569,38 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "841476ab6d3530136b5162b64a2c6969d68141843ad2fd59126e5ea84fd9b5fe" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "2b5619cef8d19530298301f91e9a0390d369260799a3d8dd01e28fc88e53637a" dependencies = [ "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli", "log 0.4.11", "regalloc", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "target-lexicon", "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "2a319709b8267939155924114ea83f2a5b5af65ece3ac6f703d4735f3c66bb0d" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -598,47 +608,49 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "15925b23cd3a448443f289d85a8f53f3cf7a80f0137aa53c8e3b01ae8aefaef7" +dependencies = [ + "serde", +] [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" +checksum = "610cf464396c89af0f9f7c64b5aa90aa9e8812ac84084098f1565b40051bc415" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "4d20c8bd4a1c41ded051734f0e33ad1d843a0adc98b9bd975ee6657e2c70cdc9" dependencies = [ "cranelift-codegen", "log 0.4.11", - "smallvec 1.4.2", + "smallvec 1.6.1", "target-lexicon", ] [[package]] name = "cranelift-native" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5246a1af14b7812ee4d94a3f0c4b295ec02c370c08b0ecc3dec512890fdad175" +checksum = "304e100df41f34a5a15291b37bfe0fd7abd0427a2c84195cc69578b4137f9099" dependencies = [ "cranelift-codegen", - "raw-cpuid", "target-lexicon", ] [[package]] name = "cranelift-wasm" -version = "0.68.0" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef491714e82f9fb910547e2047a3b1c47c03861eca67540c5abd0416371a2ac" +checksum = "4efd473b2917303957e0bfaea6ea9d08b8c93695bee015a611a2514ce5254abc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -646,9 +658,9 @@ dependencies = [ "itertools", "log 0.4.11", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "thiserror", - "wasmparser 0.65.0", + "wasmparser 0.76.0", ] [[package]] @@ -727,7 +739,7 @@ dependencies = [ "crossbeam-utils 0.7.2", "lazy_static", "maybe-uninit", - "memoffset", + "memoffset 0.5.6", "scopeguard", ] @@ -741,7 +753,7 @@ dependencies = [ "const_fn", "crossbeam-utils 0.8.0", "lazy_static", - "memoffset", + "memoffset 0.5.6", "scopeguard", ] @@ -1042,9 +1054,9 @@ dependencies = [ [[package]] name = "directories-next" -version = "1.0.3" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a28ccebc1239c5c57f0c55986e2ac03f49af0d0ca3dff29bfcad39d60a8be56" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" dependencies = [ "cfg-if 1.0.0", "dirs-sys-next", @@ -1546,21 +1558,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" dependencies = [ "fallible-iterator 0.2.0", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "git-testament" version = "0.1.9" @@ -2415,9 +2421,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" dependencies = [ "either", ] @@ -2645,6 +2651,15 @@ dependencies = [ "autocfg 1.0.1", ] +[[package]] +name = "memoffset" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d" +dependencies = [ + "autocfg 1.0.1", +] + [[package]] name = "migrations_internals" version = "1.4.1" @@ -2903,20 +2918,19 @@ dependencies = [ [[package]] name = "object" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37fd5004feb2ce328a52b0b3d01dbf4ffff72583493900ed15f22d4111c51693" -dependencies = [ - "crc32fast", - "indexmap", - "wasmparser 0.57.0", -] +checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +dependencies = [ + "crc32fast", + "indexmap", +] [[package]] name = "once_cell" @@ -3086,7 +3100,7 @@ dependencies = [ "cloudabi 0.0.3", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec 1.6.1", "winapi 0.3.9", ] @@ -3101,10 +3115,16 @@ dependencies = [ "instant", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec 1.6.1", "winapi 0.3.9", ] +[[package]] +name = "paste" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" + [[package]] name = "percent-encoding" version = "1.0.1" @@ -3685,17 +3705,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "raw-cpuid" -version = "7.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" -dependencies = [ - "bitflags 1.2.1", - "cc", - "rustc_version", -] - [[package]] name = "rayon" version = "1.5.0" @@ -3755,7 +3764,8 @@ checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5" dependencies = [ "log 0.4.11", "rustc-hash", - "smallvec 1.4.2", + "serde", + "smallvec 1.6.1", ] [[package]] @@ -4315,9 +4325,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.4.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" @@ -5432,12 +5442,6 @@ version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" -[[package]] -name = "wasmparser" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6" - [[package]] name = "wasmparser" version = "0.63.1" @@ -5446,31 +5450,34 @@ checksum = "89e4bce139034f66d49ad6071f6eda10f7188b0ad3cbfe080d673535ee30c23e" [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" +checksum = "755a9a4afe3f6cccbbe6d7e965eef44cf260b001f93e547eba84255c1d0187d8" [[package]] name = "wasmtime" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4d945221f4d29feecdac80514c1ef1527dfcdcc7715ff1b4a5161fe5c8ebab" +checksum = "26ea2ad49bb047e10ca292f55cd67040bef14b676d07e7b04ed65fd312d52ece" dependencies = [ "anyhow", "backtrace", "bincode", "cfg-if 1.0.0", - "lazy_static", + "cpp_demangle", + "indexmap", "libc", "log 0.4.11", + "paste", "region", "rustc-demangle", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "target-lexicon", - "wasmparser 0.65.0", + "wasmparser 0.76.0", "wasmtime-cache", "wasmtime-environ", + "wasmtime-fiber", "wasmtime-jit", "wasmtime-profiling", "wasmtime-runtime", @@ -5480,12 +5487,12 @@ dependencies = [ [[package]] name = "wasmtime-cache" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b27d71f896587548eeafb5f63daad596330fd161620d9048e251917926622fb5" +checksum = "9353a705eb98838d885a4d0186c087167fd5ea087ef3511bdbdf1a79420a1d2d" dependencies = [ "anyhow", - "base64 0.12.3", + "base64 0.13.0", "bincode", "directories-next", "errno", @@ -5493,7 +5500,7 @@ dependencies = [ "libc", "log 0.4.11", "serde", - "sha2 0.8.2", + "sha2 0.9.3", "toml", "winapi 0.3.9", "zstd", @@ -5501,59 +5508,73 @@ dependencies = [ [[package]] name = "wasmtime-cranelift" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e55c17317922951a9bdd5547b527d2cc7be3cea118dc17ad7c05a4c8e67c7a" +checksum = "5e769b80abbb89255926f69ba37085f7dd6608c980134838c3c89d7bf6e776bc" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "cranelift-wasm", + "wasmparser 0.76.0", "wasmtime-environ", ] [[package]] name = "wasmtime-debug" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576daa6b228f8663c38bede2f7f23d094d578b0061c39fc122cc28eee1e2c18" +checksum = "38501788c936a4932b0ddf61135963a4b7d1f549f63a6908ae56a1c86d74fc7b" dependencies = [ "anyhow", - "gimli 0.22.0", + "gimli", "more-asserts", - "object 0.21.1", + "object 0.23.0", "target-lexicon", "thiserror", - "wasmparser 0.65.0", + "wasmparser 0.76.0", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396ceda32fd67205235c098e092a85716942883bfd2c773c250cf5f2457b8307" +checksum = "fae793ea1387b2fede277d209bb27285366df58f0a3ae9d59e58a7941dce60fa" dependencies = [ "anyhow", "cfg-if 1.0.0", "cranelift-codegen", "cranelift-entity", "cranelift-wasm", - "gimli 0.22.0", + "gimli", "indexmap", "log 0.4.11", "more-asserts", + "region", "serde", "thiserror", - "wasmparser 0.65.0", + "wasmparser 0.76.0", +] + +[[package]] +name = "wasmtime-fiber" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c479ba281bc54236209f43a954fc2a874ca3e5fa90116576b1ae23782948783f" +dependencies = [ + "cc", + "libc", + "winapi 0.3.9", ] [[package]] name = "wasmtime-jit" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a45f6dd5bdf12d41f10100482d58d9cb160a85af5884dfd41a2861af4b0f50" +checksum = "9b3bd0fae8396473a68a1491559d61776127bb9bea75c9a6a6c038ae4a656eb2" dependencies = [ + "addr2line", "anyhow", "cfg-if 1.0.0", "cranelift-codegen", @@ -5561,16 +5582,16 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.22.0", + "gimli", "log 0.4.11", "more-asserts", - "object 0.21.1", + "object 0.23.0", "rayon", "region", "serde", "target-lexicon", "thiserror", - "wasmparser 0.65.0", + "wasmparser 0.76.0", "wasmtime-cranelift", "wasmtime-debug", "wasmtime-environ", @@ -5582,13 +5603,13 @@ dependencies = [ [[package]] name = "wasmtime-obj" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84aebe3b4331a603625f069944192fa3f6ffe499802ef91273fd73af9a8087d" +checksum = "a79fa098a3be8fabc50f5be60f8e47694d569afdc255de37850fc80295485012" dependencies = [ "anyhow", "more-asserts", - "object 0.21.1", + "object 0.23.0", "target-lexicon", "wasmtime-debug", "wasmtime-environ", @@ -5596,16 +5617,16 @@ dependencies = [ [[package]] name = "wasmtime-profiling" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f27fda1b81d701f7ea1da9ae51b5b62d4cdc37ca5b93eae771ca2cde53b70c" +checksum = "d81e2106efeef4c01917fd16956a91d39bb78c07cf97027abdba9ca98da3f258" dependencies = [ "anyhow", "cfg-if 1.0.0", - "gimli 0.22.0", + "gimli", "lazy_static", "libc", - "object 0.21.1", + "object 0.23.0", "scroll", "serde", "target-lexicon", @@ -5615,10 +5636,11 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "0.21.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e452b8b3b32dbf1b831f05003a740581cc2c3c2122f5806bae9f167495e1e66c" +checksum = "f747c656ca4680cad7846ae91c57d03f2dd4f4170da77a700df4e21f0d805378" dependencies = [ + "anyhow", "backtrace", "cc", "cfg-if 1.0.0", @@ -5626,9 +5648,10 @@ dependencies = [ "lazy_static", "libc", "log 0.4.11", - "memoffset", + "memoffset 0.6.3", "more-asserts", "psm", + "rand 0.7.3", "region", "thiserror", "wasmtime-environ", @@ -5637,18 +5660,18 @@ dependencies = [ [[package]] name = "wast" -version = "27.0.0" +version = "35.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2c3ef5f6a72dffa44c24d5811123f704e18a1dbc83637d347b1852b41d3835c" +checksum = "1a5800e9f86a1eae935e38bea11e60fd253f6d514d153fb39b3e5535a7b37b56" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.28" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835cf59c907f67e2bbc20f50157e08f35006fe2a8444d8ec9f5683e22f937045" +checksum = "0b0fa059022c5dabe129f02b429d67086400deb8277f89c975555dacc1dadbcc" dependencies = [ "wast", ] @@ -5796,18 +5819,18 @@ checksum = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a" [[package]] name = "zstd" -version = "0.5.3+zstd.1.4.5" +version = "0.6.1+zstd.1.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b32eaf771efa709e8308605bbf9319bf485dc1503179ec0469b611937c0cd8" +checksum = "5de55e77f798f205d8561b8fe2ef57abfb6e0ff2abe7fd3c089e119cdb5631a3" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "2.0.5+zstd.1.4.5" +version = "3.0.1+zstd.1.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfb642e0d27f64729a639c52db457e0ae906e7bc6f5fe8f5c453230400f1055" +checksum = "1387cabcd938127b30ce78c4bf00b30387dddf704e3f0881dbc4ff62b5566f8c" dependencies = [ "libc", "zstd-sys", @@ -5815,12 +5838,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.4.17+zstd.1.4.5" +version = "1.4.20+zstd.1.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89249644df056b522696b1bb9e7c18c87e8ffa3e2f0dc3b0155875d6498f01b" +checksum = "ebd5b733d7cf2d9447e2c3e76a5589b4f5e5ae065c22a2bc0b023cbc331b6c8e" dependencies = [ "cc", - "glob", - "itertools", "libc", ] diff --git a/runtime/wasm/Cargo.toml b/runtime/wasm/Cargo.toml index 7b245bf8d94..d11ea7f69c6 100644 --- a/runtime/wasm/Cargo.toml +++ b/runtime/wasm/Cargo.toml @@ -20,7 +20,7 @@ strum = "0.20.0" strum_macros = "0.20.1" bytes = "0.5" anyhow = "1.0" -wasmtime = "0.21.0" +wasmtime = "0.25.0" defer = "0.1" never = "0.1" diff --git a/runtime/wasm/src/mapping.rs b/runtime/wasm/src/mapping.rs index 1a071eeaeba..d1562480f75 100644 --- a/runtime/wasm/src/mapping.rs +++ b/runtime/wasm/src/mapping.rs @@ -168,13 +168,15 @@ impl ValidModule { config.interruptable(true); // For timeouts. config.cranelift_nan_canonicalization(true); // For NaN determinism. config.cranelift_opt_level(wasmtime::OptLevel::None); - let engine = &wasmtime::Engine::new(&config); + let engine = &wasmtime::Engine::new(&config)?; let module = wasmtime::Module::from_binary(&engine, raw_module)?; let mut import_name_to_modules: BTreeMap> = BTreeMap::new(); + + // Unwrap: Module linking is disabled. for (name, module) in module .imports() - .map(|import| (import.name(), import.module())) + .map(|import| (import.name().unwrap(), import.module())) { import_name_to_modules .entry(name.to_string()) diff --git a/runtime/wasm/src/module/mod.rs b/runtime/wasm/src/module/mod.rs index 939541524ee..efff78b3700 100644 --- a/runtime/wasm/src/module/mod.rs +++ b/runtime/wasm/src/module/mod.rs @@ -86,12 +86,11 @@ impl WasmInstance { let user_data = self.asc_new(user_data)?; // Invoke the callback - let func = self - .instance + self.instance .get_func(handler_name) .with_context(|| format!("function {} not found", handler_name))? - .get2()?; - func(value.wasm_ptr(), user_data.wasm_ptr()) + .typed()? + .call((value.wasm_ptr(), user_data.wasm_ptr())) .with_context(|| format!("Failed to handle callback '{}'", handler_name))?; Ok(self.take_ctx().ctx.state) @@ -204,7 +203,7 @@ impl WasmInstance { self.instance_ctx_mut().ctx.state.enter_handler(); // This `match` will return early if there was a non-deterministic trap. - let deterministic_error: Option = match func.get1()?(arg.wasm_ptr()) { + let deterministic_error: Option = match func.typed()?.call(arg.wasm_ptr()) { Ok(()) => None, Err(trap) if self.instance_ctx().possible_reorg => { self.instance_ctx_mut().ctx.state.exit_handler(); @@ -287,7 +286,10 @@ pub(crate) struct WasmInstanceContext { // module. And at least AS calls it "memory". There is no uninitialized memory in Wasm, memory // is zeroed when initialized or grown. memory: Memory, - memory_allocate: Box Result>, + + // Function exported by the wasm module that will allocate the request number of bytes and + // return a pointer to the first byte of allocated space. + memory_allocate: wasmtime::TypedFunc, pub ctx: MappingContext, pub(crate) valid_module: Arc, @@ -610,7 +612,7 @@ impl AscHeap for WasmInstanceContext { // Allocate a new arena. Any free space left in the previous arena is left unused. This // causes at most half of memory to be wasted, which is acceptable. let arena_size = size.max(MIN_ARENA_SIZE); - self.arena_start_ptr = (self.memory_allocate)(arena_size).unwrap(); + self.arena_start_ptr = self.memory_allocate.call(arena_size).unwrap(); self.arena_free_size = arena_size; }; @@ -685,10 +687,11 @@ impl WasmInstanceContext { let memory_allocate = instance .get_func("memory.allocate") .context("`memory.allocate` function not found")? - .get1()?; + .typed()? + .clone(); Ok(WasmInstanceContext { - memory_allocate: Box::new(memory_allocate), + memory_allocate, memory, ctx, valid_module, @@ -721,10 +724,11 @@ impl WasmInstanceContext { .get_export("memory.allocate") .and_then(|e| e.into_func()) .context("`memory.allocate` function not found")? - .get1()?; + .typed()? + .clone(); Ok(WasmInstanceContext { - memory_allocate: Box::new(memory_allocate), + memory_allocate, memory, ctx, valid_module, diff --git a/runtime/wasm/src/module/test.rs b/runtime/wasm/src/module/test.rs index 499d1a798c5..51e0fd1a439 100644 --- a/runtime/wasm/src/module/test.rs +++ b/runtime/wasm/src/module/test.rs @@ -219,14 +219,14 @@ fn mock_context( impl WasmInstance { fn invoke_export(&self, f: &str, arg: AscPtr) -> AscPtr { - let func = self.get_func(f).get1().unwrap(); - let ptr: u32 = func(arg.wasm_ptr()).unwrap(); + let func = self.get_func(f).typed().unwrap().clone(); + let ptr: u32 = func.call(arg.wasm_ptr()).unwrap(); ptr.into() } fn invoke_export2(&self, f: &str, arg0: AscPtr, arg1: AscPtr) -> AscPtr { - let func = self.get_func(f).get2().unwrap(); - let ptr: u32 = func(arg0.wasm_ptr(), arg1.wasm_ptr()).unwrap(); + let func = self.get_func(f).typed().unwrap().clone(); + let ptr: u32 = func.call((arg0.wasm_ptr(), arg1.wasm_ptr())).unwrap(); ptr.into() } @@ -236,18 +236,18 @@ impl WasmInstance { arg0: AscPtr, arg1: AscPtr, ) -> Result<(), wasmtime::Trap> { - let func = self.get_func(f).get2().unwrap(); - func(arg0.wasm_ptr(), arg1.wasm_ptr()) + let func = self.get_func(f).typed().unwrap().clone(); + func.call((arg0.wasm_ptr(), arg1.wasm_ptr())) } fn takes_ptr_returns_val(&mut self, fn_name: &str, v: AscPtr

) -> V { - let func = self.get_func(fn_name).get1().unwrap(); - func(v.wasm_ptr()).unwrap() + let func = self.get_func(fn_name).typed().unwrap().clone(); + func.call(v.wasm_ptr()).unwrap() } fn takes_val_returns_ptr

(&mut self, fn_name: &str, val: impl wasmtime::WasmTy) -> AscPtr

{ - let func = self.get_func(fn_name).get1().unwrap(); - let ptr: u32 = func(val).unwrap(); + let func = self.get_func(fn_name).typed().unwrap().clone(); + let ptr: u32 = func.call(val).unwrap(); ptr.into() } } @@ -383,8 +383,8 @@ async fn ipfs_map() { let user_data = module.asc_new(USER_DATA).unwrap(); // Invoke the callback - let func = module.get_func("ipfsMap").get2().unwrap(); - let _: () = func(value.wasm_ptr(), user_data.wasm_ptr())?; + let func = module.get_func("ipfsMap").typed().unwrap().clone(); + let _: () = func.call((value.wasm_ptr(), user_data.wasm_ptr()))?; let mut mods = module .take_ctx() .ctx @@ -592,8 +592,7 @@ async fn big_int_arithmetic() { #[tokio::test] async fn abort() { let module = test_module("abort", mock_data_source("wasm_test/abort.wasm")); - let func = module.get_func("abort").get0().unwrap(); - let res: Result<(), _> = func(); + let res: Result<(), _> = module.get_func("abort").typed().unwrap().call(()); assert!(res .unwrap_err() .to_string() diff --git a/runtime/wasm/src/module/test/abi.rs b/runtime/wasm/src/module/test/abi.rs index e267dedf702..5053006bb68 100644 --- a/runtime/wasm/src/module/test/abi.rs +++ b/runtime/wasm/src/module/test/abi.rs @@ -9,8 +9,7 @@ async fn unbounded_loop() { Some(Duration::from_secs(3)), ) .0; - let func = module.get_func("loop").get0().unwrap(); - let res: Result<(), _> = func(); + let res: Result<(), _> = module.get_func("loop").typed().unwrap().call(()); assert!(res.unwrap_err().to_string().contains(TRAP_TIMEOUT)); } @@ -20,8 +19,7 @@ async fn unbounded_recursion() { "unboundedRecursion", mock_data_source("wasm_test/non_terminating.wasm"), ); - let func = module.get_func("rabbit_hole").get0().unwrap(); - let res: Result<(), _> = func(); + let res: Result<(), _> = module.get_func("rabbit_hole").typed().unwrap().call(()); let err_msg = res.unwrap_err().to_string(); assert!(err_msg.contains("call stack exhausted"), "{:#?}", err_msg); } @@ -153,8 +151,8 @@ async fn abi_ethabi_token_identity() { let token_bool = Token::Bool(true); let token_bool_ptr = module.asc_new(&token_bool).unwrap(); - let func = module.get_func("token_to_bool").get1().unwrap(); - let boolean: i32 = func(token_bool_ptr.wasm_ptr()).unwrap(); + let func = module.get_func("token_to_bool").typed().unwrap().clone(); + let boolean: i32 = func.call(token_bool_ptr.wasm_ptr()).unwrap(); let new_token_ptr = module.takes_val_returns_ptr("token_from_bool", boolean); let new_token = module.asc_get(new_token_ptr).unwrap(); @@ -197,8 +195,8 @@ async fn abi_store_value() { ); // Value::Null - let func = module.get_func("value_null").get0().unwrap(); - let ptr: u32 = func().unwrap(); + let func = module.get_func("value_null").typed().unwrap().clone(); + let ptr: u32 = func.call(()).unwrap(); let null_value_ptr: AscPtr> = ptr.into(); let null_value: Value = module.try_asc_get(null_value_ptr).unwrap(); assert_eq!(null_value, Value::Null); @@ -237,8 +235,14 @@ async fn abi_store_value() { assert_eq!(new_value, Value::Bool(boolean)); // Value::List - let func = module.get_func("array_from_values").get2().unwrap(); - let new_value_ptr: u32 = func(module.asc_new(string).unwrap().wasm_ptr(), int).unwrap(); + let func = module + .get_func("array_from_values") + .typed() + .unwrap() + .clone(); + let new_value_ptr: u32 = func + .call((module.asc_new(string).unwrap().wasm_ptr(), int)) + .unwrap(); let new_value_ptr = AscPtr::from(new_value_ptr); let new_value: Value = module.try_asc_get(new_value_ptr).unwrap(); assert_eq!( @@ -358,7 +362,11 @@ async fn invalid_discriminant() { mock_data_source("wasm_test/abi_store_value.wasm"), ); - let func = module.get_func("invalid_discriminant").get0().unwrap(); - let ptr: u32 = func().unwrap(); + let func = module + .get_func("invalid_discriminant") + .typed() + .unwrap() + .clone(); + let ptr: u32 = func.call(()).unwrap(); let _value: Value = module.try_asc_get(ptr.into()).unwrap(); } From 6ca1dbe2084c2354d1eda4769c7cab533a100bd0 Mon Sep 17 00:00:00 2001 From: Leonardo Yvens Date: Wed, 31 Mar 2021 11:53:04 -0300 Subject: [PATCH 2/2] runtime: Use safe methods to access wasm memory --- runtime/wasm/src/module/mod.rs | 43 +++++++++------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/runtime/wasm/src/module/mod.rs b/runtime/wasm/src/module/mod.rs index efff78b3700..f1bb28ac096 100644 --- a/runtime/wasm/src/module/mod.rs +++ b/runtime/wasm/src/module/mod.rs @@ -612,25 +612,18 @@ impl AscHeap for WasmInstanceContext { // Allocate a new arena. Any free space left in the previous arena is left unused. This // causes at most half of memory to be wasted, which is acceptable. let arena_size = size.max(MIN_ARENA_SIZE); + + // Unwrap: This may panic if more memory needs to be requested from the OS and that + // fails. This error is not deterministic since it depends on the operating conditions + // of the node. self.arena_start_ptr = self.memory_allocate.call(arena_size).unwrap(); self.arena_free_size = arena_size; }; let ptr = self.arena_start_ptr as usize; - // Safety: - // First `wasmtime::Memory` is `!Sync`, so two threads cannot simultaneously hold a - // reference into it. Given that, accessing the memory is only unsound if a reference into - // the memory is exists at this point [1]. Since we are in safe code up to this point, that - // reference can only exist if it originated in a previously executed unsafe block. - // Therefore: - // - If no unsafe block exposes references into memory to safe code and each individual - // unsafe block does not cause unsoundness by itself, then the entire program is sound. - // [1] - https://docs.rs/wasmtime/0.17.0/wasmtime/struct.Memory.html - // - // This unsafe block has been checked to not cause unsoundness by itself. - // See also 2155cdca-dfaa-4fba-86e4-289e7683c1bf - unsafe { self.memory.data_unchecked_mut()[ptr..(ptr + bytes.len())].copy_from_slice(bytes) } + // Unwrap: We have just allocated enough space for `bytes`. + self.memory.write(ptr, bytes).unwrap(); self.arena_start_ptr += size; self.arena_free_size -= size; @@ -641,31 +634,17 @@ impl AscHeap for WasmInstanceContext { let offset = offset as usize; let size = size as usize; - let end = offset.checked_add(size).ok_or_else(|| { - DeterministicHostError(anyhow!( - "Overflow when accessing heap slice. Offset: {} Size: {}", - offset, - size - )) - })?; + let mut data = vec![0; size]; - // Safety: - // This unsafe block has been checked to not cause unsoundness by itself. - // See 2155cdca-dfaa-4fba-86e4-289e7683c1bf for why this is sufficient. - let data = unsafe { - self.memory - .data_unchecked() - .get(offset..end) - .map(|s| s.to_vec()) - }; - - data.ok_or_else(|| { + self.memory.read(offset, &mut data).map_err(|_| { DeterministicHostError(anyhow!( "Heap access out of bounds. Offset: {} Size: {}", offset, size )) - }) + })?; + + Ok(data) } }