diff options
author | Andreu Botella <andreu@andreubotella.com> | 2022-03-22 11:33:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-22 11:33:29 +0100 |
commit | 12d28dffc6c8d08e6620751e55d8a382c66443a2 (patch) | |
tree | 9ad9058ec93c39d5b8015d80cd88d1fa4abf14bc /cli/tests | |
parent | c5792d6d1dcd2fe60e59e836015eac4f05a76039 (diff) |
fix(fetch): Fix uncaught rejection panic with `WebAssembly.instantiateStreaming` (#13925)
When an exception is thrown during the processing of streaming WebAssembly,
`op_wasm_streaming_abort` is called. This op calls into V8, which synchronously
rejects the promise and calls into the promise rejection handler, if applicable.
But calling an op borrows the isolate's `JsRuntimeState` for the duration of the
op, which means it is borrowed when V8 calls into `promise_reject_callback`,
which tries to borrow it again, panicking.
This change changes `op_wasm_streaming_abort` from an op to a binding
(`Deno.core.abortWasmStreaming`). Although that binding must borrow the
`JsRuntimeState` in order to access the `WasmStreamingResource` stored in the
`OpTable`, it also takes ownership of that `WasmStreamingResource` instance,
which means it can drop any borrows of the `JsRuntimeState` before calling into
V8.
Diffstat (limited to 'cli/tests')
-rw-r--r-- | cli/tests/integration/run_tests.rs | 6 | ||||
-rw-r--r-- | cli/tests/testdata/wasm_streaming_panic_test.js | 3 | ||||
-rw-r--r-- | cli/tests/testdata/wasm_streaming_panic_test.js.out | 2 |
3 files changed, 11 insertions, 0 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 7c82acbf7..aec17faf0 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2511,3 +2511,9 @@ itest!(config_not_auto_discovered_for_remote_script { output_str: Some("ok\n"), http_server: true, }); + +itest!(wasm_streaming_panic_test { + args: "run wasm_streaming_panic_test.js", + output: "wasm_streaming_panic_test.js.out", + exit_code: 1, +}); diff --git a/cli/tests/testdata/wasm_streaming_panic_test.js b/cli/tests/testdata/wasm_streaming_panic_test.js new file mode 100644 index 000000000..ec017592f --- /dev/null +++ b/cli/tests/testdata/wasm_streaming_panic_test.js @@ -0,0 +1,3 @@ +// https://github.com/denoland/deno/issues/13917 + +WebAssembly.instantiateStreaming(Response.error()); diff --git a/cli/tests/testdata/wasm_streaming_panic_test.js.out b/cli/tests/testdata/wasm_streaming_panic_test.js.out new file mode 100644 index 000000000..c21d709dd --- /dev/null +++ b/cli/tests/testdata/wasm_streaming_panic_test.js.out @@ -0,0 +1,2 @@ +error: Uncaught (in promise) TypeError: Invalid WebAssembly content type. + at deno:ext/fetch/26_fetch.js:[WILDCARD] |