Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2020-05-16 12:39:53 +0300
committerRuben Bridgewater <ruben@bridgewater.de>2020-05-23 19:59:44 +0300
commitd85a9332508bbc39ddc011e9e5a1fd5f71a985bb (patch)
tree708c180d1d748b87aa90b88858db72c34a3461ea
parent8ddb6aa88694f4a5a2a05a46f66508c683b850d2 (diff)
wasi,worker: handle termination exception
Be careful when emitting the 'beforeExit' event. It's not allowed to call into the runtime when a termination exception is pending. Fixes: https://github.com/nodejs/node/issues/33377 PR-URL: https://github.com/nodejs/node/pull/33386 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r--src/api/hooks.cc13
-rw-r--r--src/node_process_events.cc8
-rw-r--r--test/wasi/test-wasi-worker-terminate.js44
3 files changed, 58 insertions, 7 deletions
diff --git a/src/api/hooks.cc b/src/api/hooks.cc
index d0113670457..037bdda6f41 100644
--- a/src/api/hooks.cc
+++ b/src/api/hooks.cc
@@ -37,11 +37,14 @@ void EmitBeforeExit(Environment* env) {
HandleScope handle_scope(env->isolate());
Context::Scope context_scope(env->context());
- Local<Value> exit_code = env->process_object()
- ->Get(env->context(), env->exit_code_string())
- .ToLocalChecked()
- ->ToInteger(env->context())
- .ToLocalChecked();
+
+ Local<Value> exit_code_v;
+ if (!env->process_object()->Get(env->context(), env->exit_code_string())
+ .ToLocal(&exit_code_v)) return;
+
+ Local<Integer> exit_code;
+ if (!exit_code_v->ToInteger(env->context()).ToLocal(&exit_code)) return;
+
ProcessEmit(env, "beforeExit", exit_code).ToLocalChecked();
}
diff --git a/src/node_process_events.cc b/src/node_process_events.cc
index d192ef19b7a..1b902949e26 100644
--- a/src/node_process_events.cc
+++ b/src/node_process_events.cc
@@ -24,10 +24,14 @@ MaybeLocal<Value> ProcessEmit(Environment* env,
const char* event,
Local<Value> message) {
// Send message to enable debug in cluster workers
- Local<Object> process = env->process_object();
Isolate* isolate = env->isolate();
- Local<Value> argv[] = {OneByteString(isolate, event), message};
+ Local<String> event_string;
+ if (!String::NewFromOneByte(isolate, reinterpret_cast<const uint8_t*>(event))
+ .ToLocal(&event_string)) return MaybeLocal<Value>();
+
+ Local<Object> process = env->process_object();
+ Local<Value> argv[] = {event_string, message};
return MakeCallback(isolate, process, "emit", arraysize(argv), argv, {0, 0});
}
diff --git a/test/wasi/test-wasi-worker-terminate.js b/test/wasi/test-wasi-worker-terminate.js
new file mode 100644
index 00000000000..118c2a9d47e
--- /dev/null
+++ b/test/wasi/test-wasi-worker-terminate.js
@@ -0,0 +1,44 @@
+// Flags: --experimental-wasi-unstable-preview1
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const { WASI } = require('wasi');
+const { Worker, parentPort } = require('worker_threads');
+
+// void _start(void) { for (;;); }
+const bytecode = new Uint8Array([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+ 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01,
+ 0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41,
+ 0x80, 0x88, 0x04, 0x0b, 0x07, 0x13, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f,
+ 0x72, 0x79, 0x02, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00,
+ 0x00, 0x0a, 0x09, 0x01, 0x07, 0x00, 0x03, 0x40, 0x0c, 0x00, 0x0b, 0x0b,
+ 0x00, 0x10, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x01, 0x09, 0x01, 0x00, 0x06,
+ 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x2f, 0x09, 0x70, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, 0x0c, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c,
+ 0x61, 0x6e, 0x67, 0x0f, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x34,
+ 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x31
+]);
+
+// Do not use isMainThread so that this test itself can be run inside a Worker.
+if (!process.env.HAS_STARTED_WORKER) {
+ process.env.HAS_STARTED_WORKER = 1;
+ const worker = new Worker(__filename);
+ worker.once('message', (message) => {
+ assert.strictEqual(message, 'start');
+ setTimeout(() => worker.terminate(), common.platformTimeout(50));
+ });
+} else {
+ go();
+}
+
+async function go() {
+ const wasi = new WASI({ returnOnExit: true });
+ const imports = { wasi_snapshot_preview1: wasi.wasiImport };
+ const module = await WebAssembly.compile(bytecode);
+ const instance = await WebAssembly.instantiate(module, imports);
+ parentPort.postMessage('start');
+ wasi.start(instance);
+}