From 2b9bb2d09efefe72aff7e29ee8cb96280a6b37d6 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 2 Sep 2026 23:53:27 +0000 Subject: [PATCH] inspector: fix connectToMainThread() abort without parent inspector `inspector.Session#connectToMainThread()` in a Worker aborted the process on `CHECK_NOT_NULL(parent_handle_)` in `Agent::ConnectToMainThread()` when the parent Environment was created with `kNoCreateInspector`, as embedders that run their own inspector (or none) do. Throw the new `ERR_INSPECTOR_NOT_AVAILABLE` in that case, next to the existing throw for a Worker whose own inspector is not initialized. Refs: https://github.com/nodejs/node/pull/35025 Signed-off-by: Shelley Vohr --- src/inspector_agent.cc | 6 +++++- src/node_errors.h | 1 + test/cctest/test_environment.cc | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index dcec24c16dba..418258a37508 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -962,8 +962,12 @@ std::unique_ptr Agent::ConnectToMainThread( ThrowUninitializedInspectorError(parent_env_); return std::unique_ptr{}; } + if (!parent_handle_) { + THROW_ERR_INSPECTOR_NOT_AVAILABLE( + parent_env_, "The parent thread's inspector is not available"); + return std::unique_ptr{}; + } - CHECK_NOT_NULL(parent_handle_); CHECK_NOT_NULL(client_); auto thread_safe_delegate = client_->getThreadHandle()->MakeDelegateThreadSafe(std::move(delegate)); diff --git a/src/node_errors.h b/src/node_errors.h index cab1dc76dcc7..6e29fe8584ee 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -96,6 +96,7 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details); V(ERR_HEAP_PROFILE_HAVE_BEEN_STARTED, Error) \ V(ERR_HEAP_PROFILE_NOT_STARTED, Error) \ V(ERR_ILLEGAL_CONSTRUCTOR, Error) \ + V(ERR_INSPECTOR_NOT_AVAILABLE, Error) \ V(ERR_INVALID_ADDRESS, Error) \ V(ERR_INVALID_ARG_VALUE, TypeError) \ V(ERR_OSSL_EVP_INVALID_DIGEST, Error) \ diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc index 96259ec50227..5127928b579a 100644 --- a/test/cctest/test_environment.cc +++ b/test/cctest/test_environment.cc @@ -432,6 +432,27 @@ TEST_F(EnvironmentTest, SharedIsolateDataLoadsBindingsTwice) { EXPECT_EQ(node::SpinEventLoop(*env2).FromJust(), 0); } +#if HAVE_INSPECTOR +TEST_F(EnvironmentTest, WorkerConnectToMainThreadWithoutInspector) { + const v8::HandleScope handle_scope(isolate_); + const Argv argv; + Env env{handle_scope, argv, node::EnvironmentFlags::kNoCreateInspector}; + node::LoadEnvironment( + *env, + "const { Worker } = require('worker_threads');" + "const w = new Worker(`" + " const { Session } = require('inspector');" + " try { new Session().connectToMainThread(); }" + " catch (e) { process.exit(e.code === 'ERR_INSPECTOR_NOT_AVAILABLE' ?" + " 0 : 2); }" + " process.exit(3);" + "`, { eval: true });" + "w.on('exit', (code) => { process.exitCode = code; });") + .ToLocalChecked(); + EXPECT_EQ(node::SpinEventLoop(*env).FromJust(), 0); +} +#endif // HAVE_INSPECTOR + TEST_F(EnvironmentTest, NoEnvironmentSanity) { const v8::HandleScope handle_scope(isolate_); v8::Local context = v8::Context::New(isolate_);