summaryrefslogtreecommitdiff
path: root/src/node_messaging.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2020-02-08 16:57:02 +0100
committerAnna Henningsen <anna@addaleax.net>2020-02-10 17:27:53 +0100
commitf938cbd77d487559d273a975bb43ecf8439f9146 (patch)
tree61cc54b30f6b7d4ab1b11bdacea07e9b3900a068 /src/node_messaging.cc
parent0ac04ecee20f00cf3daaf006496d461bb9fecbc2 (diff)
downloadnode-new-f938cbd77d487559d273a975bb43ecf8439f9146.tar.gz
src: do not unnecessarily re-assign uv handle data
a555be2e45b283 re-assigned `async_.data` to indicate success or failure of the constructor. As the `HandleWrap` implementation uses that field to access the `HandleWrap` instance from the libuv handle, this introduced two issues: - It implicitly assumed that casting `MessagePort*` → `void*` → `HandleWrap*` would be valid. - It made the `HandleWrap::OnClose()` function fail with a `nullptr` dereference if the constructor did fail. In particular, the second issue made test/parallel/test-worker-cleanexit-with-moduleload.js` crash at least once in CI. Since re-assigning `async_.data` isn’t actually necessary here (only a leftover from earlier versions of that commit), fix this by using a local variable instead, and add a `CHECK` that provides better error messages for this type of issue in the future. Refs: https://github.com/nodejs/node/pull/31605 PR-URL: https://github.com/nodejs/node/pull/31696 Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/node_messaging.cc')
-rw-r--r--src/node_messaging.cc9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/node_messaging.cc b/src/node_messaging.cc
index a66cae35d3..248e0f041d 100644
--- a/src/node_messaging.cc
+++ b/src/node_messaging.cc
@@ -488,10 +488,9 @@ MessagePort::MessagePort(Environment* env,
CHECK_EQ(uv_async_init(env->event_loop(),
&async_,
onmessage), 0);
- async_.data = nullptr; // Reset later to indicate success of the constructor.
- auto cleanup = OnScopeLeave([&]() {
- if (async_.data == nullptr) Close();
- });
+ // Reset later to indicate success of the constructor.
+ bool succeeded = false;
+ auto cleanup = OnScopeLeave([&]() { if (!succeeded) Close(); });
Local<Value> fn;
if (!wrap->Get(context, env->oninit_symbol()).ToLocal(&fn))
@@ -508,7 +507,7 @@ MessagePort::MessagePort(Environment* env,
return;
emit_message_fn_.Reset(env->isolate(), emit_message_fn);
- async_.data = static_cast<void*>(this);
+ succeeded = true;
Debug(this, "Created message port");
}