Skip to content

Conversation

legendecas
Copy link
Member

@legendecas legendecas commented Aug 26, 2025

When calling process.exit() or on uncaught exceptions as soon as the
process starts, the process will try to terminate immediately. In this
case, there could be a race condition on the unfinished off-thread
system CA loader which tries to access the OpenSSL API which has been
de-inited on the main thread.

Example stacks:

Thread 0:: MainThread Dispatch queue: com.apple.main-thread
0   libsystem_malloc.dylib        	       0x191568570 small_malloc_from_free_list + 384
1   libsystem_malloc.dylib        	       0x191567dc8 small_malloc_should_clear + 176
2   libsystem_malloc.dylib        	       0x191567c0c szone_malloc_should_clear + 120
3   node                          	       0x103e8b038 CRYPTO_malloc + 84 (mem.c:211) [inlined]
4   node                          	       0x103e8b038 CRYPTO_aligned_alloc + 128 (mem.c:277)
5   node                          	       0x103e79584 alloc_new_neighborhood_list + 16 (hashtable.c:157) [inlined]
6   node                          	       0x103e79584 ossl_ht_flush_internal + 84 (hashtable.c:292)
7   node                          	       0x103e79668 ossl_ht_free + 40 (hashtable.c:325)
8   node                          	       0x103e872b8 ossl_namemap_free + 32 (core_namemap.c:554) [inlined]
9   node                          	       0x103e872b8 ossl_stored_namemap_free + 60 (core_namemap.c:72)
10  node                          	       0x103e86c30 context_deinit_objs + 172 (context.c:295)
11  node                          	       0x103e85f0c context_deinit + 24 (context.c:376) [inlined]
12  node                          	       0x103e85f0c ossl_lib_ctx_default_deinit + 52 (context.c:415)
13  node                          	       0x103e89ba0 OPENSSL_cleanup + 196 (init.c:464)
14  libsystem_c.dylib             	       0x19161f964 __cxa_finalize_ranges + 512
15  libsystem_c.dylib             	       0x19161f704 exit + 44
16  node                          	       0x102cd3540 node::Exit(node::ExitCode) + 12 (environment.cc:988)
17  node                          	       0x102cd3590 node::DefaultProcessExitHandlerInternal(node::Environment*, node::ExitCode) + 80 (environment.cc:1007)
18  node                          	       0x102d4a268 std::__1::__function::__value_func<void (node::Environment*, node::ExitCode)>::operator()[abi:nn190102](node::Environment*&&, node::ExitCode&&) const + 28 (function.h:430) [inlined]
19  node                          	       0x102d4a268 std::__1::function<void (node::Environment*, node::ExitCode)>::operator()(node::Environment*, node::ExitCode) const + 28 (function.h:989) [inlined]
20  node                          	       0x102d4a268 node::Environment::Exit(node::ExitCode) + 400 (env.cc:1879)
21  node                          	       0x102dab73c node::errors::TriggerUncaughtException(v8::Isolate*, v8::Local<v8::Value>, v8::Local<v8::Message>, bool) + 488
22  node                          	       0x103103c48 v8::internal::MessageHandler::ReportMessageNoExceptions(v8::internal::Isolate*, v8::internal::MessageLocation const*, v8::internal::DirectHandle<v8::internal::Object>, v8::Local<v8::Value>) + 300 (messages.cc:179)
23  node                          	       0x103103ac4 v8::internal::MessageHandler::ReportMessage(v8::internal::Isolate*, v8::internal::MessageLocation const*, v8::internal::DirectHandle<v8::internal::JSMessageObject>) + 640 (messages.cc:146)
24  node                          	       0x1030f2d7c v8::internal::Isolate::ReportPendingMessages(bool) + 528 (isolate.cc:3136)
25  node                          	       0x1030dca54 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) + 1312
26  node                          	       0x1030dc50c v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::DirectHandle<v8::internal::Object>, v8::internal::DirectHandle<v8::internal::Object>, v8::base::Vector<v8::internal::DirectHandle<v8::internal::Object> const>) + 120 (execution.cc:530)
27  node                          	       0x102f60e50 v8::Function::Call(v8::Isolate*, v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 472 (api.cc:5433)
28  node                          	       0x102d8a2d4 node::builtins::BuiltinLoader::CompileAndCall(v8::Local<v8::Context>, char const*, int, v8::Local<v8::Value>*, node::Realm*) + 60 (node_builtins.cc:510) [inlined]
29  node                          	       0x102d8a2d4 node::builtins::BuiltinLoader::CompileAndCall(v8::Local<v8::Context>, char const*, node::Realm*) + 276
30  node                          	       0x102e2eac0 node::Realm::ExecuteBootstrapper(char const*) + 76 (node_realm.cc:181)
31  node                          	       0x102d6ed70 node::StartExecution(node::Environment*, char const*) + 52 (node.cc:254)
32  node                          	       0x102d6ed14 node::StartExecution(node::Environment*, std::__1::function<v8::MaybeLocal<v8::Value> (node::StartExecutionCallbackInfo const&)>) + 1756
33  node                          	       0x102cd1e28 node::LoadEnvironment(node::Environment*, std::__1::function<v8::MaybeLocal<v8::Value> (node::StartExecutionCallbackInfo const&)>, std::__1::function<void (node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Value>)>) + 368 (environment.cc:570)
34  node                          	       0x102de821c node::NodeMainInstance::Run(node::ExitCode*, node::Environment*) + 48 (node_main_instance.cc:106) [inlined]
35  node                          	       0x102de821c node::NodeMainInstance::Run() + 176 (node_main_instance.cc:99)
36  node                          	       0x102d72da4 node::StartInternal(int, char**) + 232 (node.cc:1578) [inlined]
37  node                          	       0x102d72da4 node::Start(int, char**) + 728 (node.cc:1585)
38  dyld                          	       0x1913c6b98 start + 6076

Thread 1 Crashed:
0   libsystem_pthread.dylib       	       0x191764690 pthread_rwlock_wrlock + 0
1   node                          	       0x103e993b0 CRYPTO_THREAD_write_lock + 12 (threads_pthread.c:642)
2   node                          	       0x103e34480 OSSL_DECODER_CTX_new_for_pkey + 1796 (decoder_pkey.c:921)
3   node                          	       0x103f36878 x509_pubkey_ex_d2i_ex + 612 (x_pubkey.c:208)
4   node                          	       0x103da3358 asn1_template_noexp_d2i + 188 (tasn_dec.c:682)
5   node                          	       0x103da2140 asn1_item_embed_d2i + 1504 (tasn_dec.c:422)
6   node                          	       0x103da3358 asn1_template_noexp_d2i + 188 (tasn_dec.c:682)
7   node                          	       0x103da2140 asn1_item_embed_d2i + 1504 (tasn_dec.c:422)
8   node                          	       0x103da1ae0 asn1_item_ex_d2i_intern + 40 (tasn_dec.c:118) [inlined]
9   node                          	       0x103da1ae0 ASN1_item_d2i_ex + 60 (tasn_dec.c:144) [inlined]
10  node                          	       0x103da1ae0 ASN1_item_d2i + 76 (tasn_dec.c:154)
11  node                          	       0x102f10710 node::crypto::ReadMacOSKeychainCertificates(std::__1::vector<x509_st*, std::__1::allocator<x509_st*>>*) + 372 (crypto_context.cc:527)
12  node                          	       0x104c6e57c node::crypto::GetSystemStoreCACertificates() + 20 [inlined]
13  node                          	       0x104c6e57c node::crypto::LoadSystemCACertificates(void*) (.cold.1) + 32 (crypto_context.cc:818)
14  node                          	       0x102f10d60 node::crypto::GetSystemStoreCACertificates() + 4 (crypto_context.cc:811) [inlined]
15  node                          	       0x102f10d60 node::crypto::LoadSystemCACertificates(void*) + 52 (crypto_context.cc:818)
16  libsystem_pthread.dylib       	       0x191767c0c _pthread_start + 136
17  libsystem_pthread.dylib       	       0x191762b80 thread_start + 8

Refs: #59550

@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run. labels Aug 26, 2025
@nodejs-github-bot
Copy link
Collaborator

When calling `process.exit()` or on uncaught exceptions as soon as the
process starts, the process will try to terminate immediately. In this
case, there could be a race condition on the unfinished off-thread
system CA loader which tries to access the OpenSSL API which has been
de-inited on the main thread.
@legendecas legendecas force-pushed the system-ca-off-thread branch from 3747069 to f02900e Compare August 26, 2025 10:29
Copy link
Member

@joyeecheung joyeecheung left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM though I have some comments, can be done as follow up though

// And make sure V8Platform don not call into Libuv threadpool, see Dispose
// in node_v8_platform-inl.h
uv_library_shutdown();
DisposePlatform();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed that in the normal exit path, this is done separately and guarded by kNoInitializeNodeV8Platform

node/src/node.cc

Lines 1312 to 1321 in ca76b39

if (!(flags & ProcessInitializationFlags::kNoInitializeNodeV8Platform)) {
V8::DisposePlatform();
// uv_run cannot be called from the time before the beforeExit callback
// runs until the program exits unless the event loop has any referenced
// handles after beforeExit terminates. This prevents unrefed timers
// that happen to terminate during shutdown from being run unsafely.
// Since uv_run cannot be called, uv_async handles held by the platform
// will never be fully cleaned up.
per_process::v8_platform.Dispose();
}

Maybe we should wrap the things that need to be done both on normal and abnormal exit into a helper and call them in both DefaultProcessExitHandlerInternal and TearDownOncePerProcess?

(Also, from what I can tell, this function would only get called on the main thread - it would be better to assert it, most things in this section can only be called once by one thread)

Copy link

codecov bot commented Aug 26, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 89.83%. Comparing base (886e4b3) to head (f02900e).
⚠️ Report is 45 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #59632      +/-   ##
==========================================
- Coverage   89.85%   89.83%   -0.02%     
==========================================
  Files         667      667              
  Lines      196260   196261       +1     
  Branches    38559    38562       +3     
==========================================
- Hits       176341   176319      -22     
- Misses      12368    12376       +8     
- Partials     7551     7566      +15     
Files with missing lines Coverage Δ
src/api/environment.cc 77.12% <100.00%> (+0.21%) ⬆️

... and 27 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@legendecas legendecas added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 26, 2025
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 26, 2025
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@legendecas legendecas added author ready PRs that have at least one approval, no pending requests for changes, and a CI started. commit-queue Add this label to land a pull request using GitHub Actions. labels Aug 27, 2025
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Sep 2, 2025
@nodejs-github-bot nodejs-github-bot merged commit 737b42e into nodejs:main Sep 2, 2025
74 of 79 checks passed
@nodejs-github-bot
Copy link
Collaborator

Landed in 737b42e

@legendecas legendecas deleted the system-ca-off-thread branch September 2, 2025 10:57
targos pushed a commit that referenced this pull request Sep 4, 2025
When calling `process.exit()` or on uncaught exceptions as soon as the
process starts, the process will try to terminate immediately. In this
case, there could be a race condition on the unfinished off-thread
system CA loader which tries to access the OpenSSL API which has been
de-inited on the main thread.

PR-URL: #59632
Refs: #59550
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Sep 12, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | minor | `24.7.0` -> `24.8.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v24.8.0`](https://github.com/nodejs/node/releases/tag/v24.8.0): 2025-09-10, Version 24.8.0 (Current), @&#8203;targos

[Compare Source](nodejs/node@v24.7.0...v24.8.0)

##### Notable Changes

##### HTTP/2 Network Inspection Support in Node.js

Node.js now supports inspection of HTTP/2 network calls in Chrome DevTools for Node.js.

##### Usage

Write a `test.js` script that makes HTTP/2 requests.

```js
const http2 = require('node:http2');

const client = http2.connect('https://nghttp2.org');

const req = client.request([
  ':path', '/',
  ':method', 'GET',
]);
```

Run it with these options:

```bash
node --inspect-wait --experimental-network-inspection test.js
```

Open `about:inspect` on Google Chrome and click on `Open dedicated DevTools for Node`.
The `Network` tab will let you track your HTTP/2 calls.

Contributed by Darshan Sen in [#&#8203;59611](nodejs/node#59611).

##### Other Notable Changes

- \[[`7a8e2c251d`](nodejs/node@7a8e2c251d)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in node:crypto (Filip Skokan) [#&#8203;59570](nodejs/node#59570)
- \[[`4b631be0b0`](nodejs/node@4b631be0b0)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in Web Cryptography (Filip Skokan) [#&#8203;59570](nodejs/node#59570)
- \[[`3e4b1e732c`](nodejs/node@3e4b1e732c)] - **(SEMVER-MINOR)** **crypto**: add KMAC Web Cryptography algorithms (Filip Skokan) [#&#8203;59647](nodejs/node#59647)
- \[[`b1d28785b2`](nodejs/node@b1d28785b2)] - **(SEMVER-MINOR)** **crypto**: add Argon2 Web Cryptography algorithms (Filip Skokan) [#&#8203;59544](nodejs/node#59544)
- \[[`430691d1af`](nodejs/node@430691d1af)] - **(SEMVER-MINOR)** **crypto**: support SLH-DSA KeyObject, sign, and verify (Filip Skokan) [#&#8203;59537](nodejs/node#59537)
- \[[`d6d05ba397`](nodejs/node@d6d05ba397)] - **(SEMVER-MINOR)** **worker**: add cpu profile APIs for worker (theanarkh) [#&#8203;59428](nodejs/node#59428)

##### Commits

- \[[`d913872369`](nodejs/node@d913872369)] - **assert**: cap input size in myersDiff to avoid Int32Array overflow (Haram Jeong) [#&#8203;59578](nodejs/node#59578)
- \[[`7bbbcf6666`](nodejs/node@7bbbcf6666)] - **benchmark**: sqlite prevent create both tables on prepare selects (Bruno Rodrigues) [#&#8203;59709](nodejs/node#59709)
- \[[`44d7b92271`](nodejs/node@44d7b92271)] - **benchmark**: calibrate config array-vs-concat (Rafael Gonzaga) [#&#8203;59587](nodejs/node#59587)
- \[[`7f347fc551`](nodejs/node@7f347fc551)] - **build**: fix getting OpenSSL version on Windows (Michaël Zasso) [#&#8203;59609](nodejs/node#59609)
- \[[`4a317150d5`](nodejs/node@4a317150d5)] - **build**: fix 'implicit-function-declaration' on OpenHarmony platform (hqzing) [#&#8203;59547](nodejs/node#59547)
- \[[`bda32af587`](nodejs/node@bda32af587)] - **build**: use `windows-2025` runner (Michaël Zasso) [#&#8203;59673](nodejs/node#59673)
- \[[`a4a8ed8f6e`](nodejs/node@a4a8ed8f6e)] - **build**: compile bundled uvwasi conditionally (Carlo Cabrera) [#&#8203;59622](nodejs/node#59622)
- \[[`d944a87761`](nodejs/node@d944a87761)] - **crypto**: refactor subtle methods to use synchronous import (Filip Skokan) [#&#8203;59771](nodejs/node#59771)
- \[[`7a8e2c251d`](nodejs/node@7a8e2c251d)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in node:crypto (Filip Skokan) [#&#8203;59570](nodejs/node#59570)
- \[[`4b631be0b0`](nodejs/node@4b631be0b0)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in Web Cryptography (Filip Skokan) [#&#8203;59570](nodejs/node#59570)
- \[[`3e4b1e732c`](nodejs/node@3e4b1e732c)] - **(SEMVER-MINOR)** **crypto**: add KMAC Web Cryptography algorithms (Filip Skokan) [#&#8203;59647](nodejs/node#59647)
- \[[`b1d28785b2`](nodejs/node@b1d28785b2)] - **(SEMVER-MINOR)** **crypto**: add Argon2 Web Cryptography algorithms (Filip Skokan) [#&#8203;59544](nodejs/node#59544)
- \[[`430691d1af`](nodejs/node@430691d1af)] - **(SEMVER-MINOR)** **crypto**: support SLH-DSA KeyObject, sign, and verify (Filip Skokan) [#&#8203;59537](nodejs/node#59537)
- \[[`0d1e53d935`](nodejs/node@0d1e53d935)] - **deps**: update uvwasi to 0.0.23 (Node.js GitHub Bot) [#&#8203;59791](nodejs/node#59791)
- \[[`68732cf426`](nodejs/node@68732cf426)] - **deps**: update histogram to 0.11.9 (Node.js GitHub Bot) [#&#8203;59689](nodejs/node#59689)
- \[[`f12c1ad961`](nodejs/node@f12c1ad961)] - **deps**: update googletest to [`eb2d85e`](nodejs/node@eb2d85e) (Node.js GitHub Bot) [#&#8203;59335](nodejs/node#59335)
- \[[`45af6966ae`](nodejs/node@45af6966ae)] - **deps**: upgrade npm to 11.6.0 (npm team) [#&#8203;59750](nodejs/node#59750)
- \[[`57617244a4`](nodejs/node@57617244a4)] - **deps**: V8: cherry-pick [`6b1b9bc`](nodejs/node@6b1b9bca2a8) (Xiao-Tao) [#&#8203;59283](nodejs/node#59283)
- \[[`2e6225a747`](nodejs/node@2e6225a747)] - **deps**: update amaro to 1.1.2 (Node.js GitHub Bot) [#&#8203;59616](nodejs/node#59616)
- \[[`1f7f6dfae6`](nodejs/node@1f7f6dfae6)] - **diagnostics\_channel**: revoke DEP0163 (René) [#&#8203;59758](nodejs/node#59758)
- \[[`8671a6cdb3`](nodejs/node@8671a6cdb3)] - **doc**: stabilize --disable-sigusr1 (Rafael Gonzaga) [#&#8203;59707](nodejs/node#59707)
- \[[`583b1b255d`](nodejs/node@583b1b255d)] - **doc**: update OpenSSL default security level to 2 (Jeetu Suthar) [#&#8203;59723](nodejs/node#59723)
- \[[`9b5eb6eb50`](nodejs/node@9b5eb6eb50)] - **doc**: fix missing links in the `errors` page (Nam Yooseong) [#&#8203;59427](nodejs/node#59427)
- \[[`e7bf712c57`](nodejs/node@e7bf712c57)] - **doc**: update "Type stripping in dependencies" section (Josh Kelley) [#&#8203;59652](nodejs/node#59652)
- \[[`96db47f91e`](nodejs/node@96db47f91e)] - **doc**: add Miles Guicent as triager (Miles Guicent) [#&#8203;59562](nodejs/node#59562)
- \[[`87f829bd0c`](nodejs/node@87f829bd0c)] - **doc**: mark `path.matchesGlob` as stable (Aviv Keller) [#&#8203;59572](nodejs/node#59572)
- \[[`062b2f705e`](nodejs/node@062b2f705e)] - **doc**: improve documentation for raw headers in HTTP/2 APIs (Tim Perry) [#&#8203;59633](nodejs/node#59633)
- \[[`6ab9306370`](nodejs/node@6ab9306370)] - **doc**: update install\_tools.bat free disk space (Stefan Stojanovic) [#&#8203;59579](nodejs/node#59579)
- \[[`c8d6b60da6`](nodejs/node@c8d6b60da6)] - **doc**: fix quic session instance typo (jakecastelli) [#&#8203;59642](nodejs/node#59642)
- \[[`61d0a2d1ba`](nodejs/node@61d0a2d1ba)] - **doc**: fix filehandle.read typo (Ruy Adorno) [#&#8203;59635](nodejs/node#59635)
- \[[`3276bfa0d0`](nodejs/node@3276bfa0d0)] - **doc**: update migration recomendations for `util.is**()` deprecations (Augustin Mauroy) [#&#8203;59269](nodejs/node#59269)
- \[[`11de6c7ebb`](nodejs/node@11de6c7ebb)] - **doc**: fix missing link to the Error documentation in the `http` page (Alexander Makarenko) [#&#8203;59080](nodejs/node#59080)
- \[[`f5b6829bba`](nodejs/node@f5b6829bba)] - **doc,crypto**: add description to the KEM and supports() methods (Filip Skokan) [#&#8203;59644](nodejs/node#59644)
- \[[`5bfdc7ee74`](nodejs/node@5bfdc7ee74)] - **doc,crypto**: cleanup unlinked and self method references webcrypto.md (Filip Skokan) [#&#8203;59608](nodejs/node#59608)
- \[[`010458d061`](nodejs/node@010458d061)] - **esm**: populate separate cache for require(esm) in imported CJS (Joyee Cheung) [#&#8203;59679](nodejs/node#59679)
- \[[`dbe6e63baf`](nodejs/node@dbe6e63baf)] - **esm**: fix missed renaming in ModuleJob.runSync (Joyee Cheung) [#&#8203;59724](nodejs/node#59724)
- \[[`8eb0d9d834`](nodejs/node@8eb0d9d834)] - **fs**: fix wrong order of file names in cpSync error message (Nicholas Paun) [#&#8203;59775](nodejs/node#59775)
- \[[`e69be5611f`](nodejs/node@e69be5611f)] - **fs**: fix dereference: false on cpSync (Nicholas Paun) [#&#8203;59681](nodejs/node#59681)
- \[[`2865d2ac20`](nodejs/node@2865d2ac20)] - **http**: unbreak keepAliveTimeoutBuffer (Robert Nagy) [#&#8203;59784](nodejs/node#59784)
- \[[`ade1175475`](nodejs/node@ade1175475)] - **http**: use cached '1.1' http version string (Robert Nagy) [#&#8203;59717](nodejs/node#59717)
- \[[`74a09482de`](nodejs/node@74a09482de)] - **inspector**: undici as shared-library should pass tests (Aras Abbasi) [#&#8203;59837](nodejs/node#59837)
- \[[`772f8f415a`](nodejs/node@772f8f415a)] - **inspector**: add http2 tracking support (Darshan Sen) [#&#8203;59611](nodejs/node#59611)
- \[[`3d225572d7`](nodejs/node@3d225572d7)] - ***Revert*** "**lib**: optimize writable stream buffer clearing" (Yoo) [#&#8203;59743](nodejs/node#59743)
- \[[`4fd213ce73`](nodejs/node@4fd213ce73)] - **lib**: fix isReadable and isWritable return type value (Gabriel Quaresma) [#&#8203;59089](nodejs/node#59089)
- \[[`39befddb87`](nodejs/node@39befddb87)] - **lib**: prefer TypedArrayPrototype primordials (Filip Skokan) [#&#8203;59766](nodejs/node#59766)
- \[[`0748160d2e`](nodejs/node@0748160d2e)] - **lib**: fix DOMException subclass support (Chengzhong Wu) [#&#8203;59680](nodejs/node#59680)
- \[[`1a93df808c`](nodejs/node@1a93df808c)] - **lib**: revert to using default derived class constructors (René) [#&#8203;59650](nodejs/node#59650)
- \[[`bb0755df37`](nodejs/node@bb0755df37)] - **meta**: bump `codecov/codecov-action` (dependabot\[bot]) [#&#8203;59726](nodejs/node#59726)
- \[[`45d148d9be`](nodejs/node@45d148d9be)] - **meta**: bump actions/download-artifact from 4.3.0 to 5.0.0 (dependabot\[bot]) [#&#8203;59729](nodejs/node#59729)
- \[[`01b66b122e`](nodejs/node@01b66b122e)] - **meta**: bump github/codeql-action from 3.29.2 to 3.30.0 (dependabot\[bot]) [#&#8203;59728](nodejs/node#59728)
- \[[`34f7ab5502`](nodejs/node@34f7ab5502)] - **meta**: bump actions/cache from 4.2.3 to 4.2.4 (dependabot\[bot]) [#&#8203;59727](nodejs/node#59727)
- \[[`5806ea02af`](nodejs/node@5806ea02af)] - **meta**: bump actions/checkout from 4.2.2 to 5.0.0 (dependabot\[bot]) [#&#8203;59725](nodejs/node#59725)
- \[[`f667215583`](nodejs/node@f667215583)] - **path**: refactor path joining logic for clarity and performance (Lee Jiho) [#&#8203;59781](nodejs/node#59781)
- \[[`0340fe92a6`](nodejs/node@0340fe92a6)] - **repl**: do not cause side effects in tab completion (Anna Henningsen) [#&#8203;59774](nodejs/node#59774)
- \[[`a414c1eb51`](nodejs/node@a414c1eb51)] - **repl**: fix REPL completion under unary expressions (Kingsword) [#&#8203;59744](nodejs/node#59744)
- \[[`c206f8dd87`](nodejs/node@c206f8dd87)] - **repl**: add isValidParentheses check before wrap input (Xuguang Mei) [#&#8203;59607](nodejs/node#59607)
- \[[`0bf9775ee2`](nodejs/node@0bf9775ee2)] - **sea**: implement sea.getAssetKeys() (Joyee Cheung) [#&#8203;59661](nodejs/node#59661)
- \[[`bf26b478d8`](nodejs/node@bf26b478d8)] - **sea**: allow using inspector command line flags with SEA (Joyee Cheung) [#&#8203;59568](nodejs/node#59568)
- \[[`92128a8fe2`](nodejs/node@92128a8fe2)] - **src**: use DictionaryTemplate for node\_url\_pattern (James M Snell) [#&#8203;59802](nodejs/node#59802)
- \[[`bcb29fb84f`](nodejs/node@bcb29fb84f)] - **src**: correctly report memory changes to V8 (Yaksh Bariya) [#&#8203;59623](nodejs/node#59623)
- \[[`44c24657d3`](nodejs/node@44c24657d3)] - **src**: fixup node\_messaging error handling (James M Snell) [#&#8203;59792](nodejs/node#59792)
- \[[`2cd6a3b7ec`](nodejs/node@2cd6a3b7ec)] - **src**: track async resources via pointers to stack-allocated handles (Anna Henningsen) [#&#8203;59704](nodejs/node#59704)
- \[[`34d752586f`](nodejs/node@34d752586f)] - **src**: fix build on NetBSD (Thomas Klausner) [#&#8203;59718](nodejs/node#59718)
- \[[`15fa779ac5`](nodejs/node@15fa779ac5)] - **src**: fix race on process exit and off thread CA loading (Chengzhong Wu) [#&#8203;59632](nodejs/node#59632)
- \[[`15cbd3966a`](nodejs/node@15cbd3966a)] - **src**: separate module.hasAsyncGraph and module.hasTopLevelAwait (Joyee Cheung) [#&#8203;59675](nodejs/node#59675)
- \[[`88d1ca8990`](nodejs/node@88d1ca8990)] - **src**: use non-deprecated Get/SetPrototype methods (Michaël Zasso) [#&#8203;59671](nodejs/node#59671)
- \[[`56ac9a2d46`](nodejs/node@56ac9a2d46)] - **src**: migrate WriteOneByte to WriteOneByteV2 (Chengzhong Wu) [#&#8203;59634](nodejs/node#59634)
- \[[`3d88aa9f2f`](nodejs/node@3d88aa9f2f)] - **src**: remove duplicate code (theanarkh) [#&#8203;59649](nodejs/node#59649)
- \[[`0718a70b2a`](nodejs/node@0718a70b2a)] - **src**: add name for more threads (theanarkh) [#&#8203;59601](nodejs/node#59601)
- \[[`0379a8b254`](nodejs/node@0379a8b254)] - **src**: remove JSONParser (Joyee Cheung) [#&#8203;59619](nodejs/node#59619)
- \[[`90d0a1b2e9`](nodejs/node@90d0a1b2e9)] - **src,sqlite**: refactor value conversion (Edy Silva) [#&#8203;59659](nodejs/node#59659)
- \[[`5e025c7ca7`](nodejs/node@5e025c7ca7)] - **stream**: replace manual function validation with validateFunction (방진혁) [#&#8203;59529](nodejs/node#59529)
- \[[`155a999bed`](nodejs/node@155a999bed)] - **test**: skip tests failing when run under root (Livia Medeiros) [#&#8203;59779](nodejs/node#59779)
- \[[`6313706c69`](nodejs/node@6313706c69)] - **test**: update WPT for urlpattern to [`cff1ac1`](nodejs/node@cff1ac1123) (Node.js GitHub Bot) [#&#8203;59602](nodejs/node#59602)
- \[[`41245ad4c7`](nodejs/node@41245ad4c7)] - **test**: skip more sea tests on Linux ppc64le (Richard Lau) [#&#8203;59755](nodejs/node#59755)
- \[[`df63d37ec4`](nodejs/node@df63d37ec4)] - **test**: fix internet/test-dns (Michaël Zasso) [#&#8203;59660](nodejs/node#59660)
- \[[`1f6c335e82`](nodejs/node@1f6c335e82)] - **test**: mark test-inspector-network-fetch as flaky again (Joyee Cheung) [#&#8203;59640](nodejs/node#59640)
- \[[`1798683df1`](nodejs/node@1798683df1)] - **test**: skip test-fs-cp\* tests that are constantly failing on Windows (Joyee Cheung) [#&#8203;59637](nodejs/node#59637)
- \[[`4c48ec09e5`](nodejs/node@4c48ec09e5)] - **test**: deflake test-http-keep-alive-empty-line (Luigi Pinca) [#&#8203;59595](nodejs/node#59595)
- \[[`dcdb259e85`](nodejs/node@dcdb259e85)] - **test\_runner**: fix todo inheritance (Moshe Atlow) [#&#8203;59721](nodejs/node#59721)
- \[[`24177973a2`](nodejs/node@24177973a2)] - **test\_runner**: set mock timer's interval undefined (hotpineapple) [#&#8203;59479](nodejs/node#59479)
- \[[`83d11f8a7a`](nodejs/node@83d11f8a7a)] - **tools**: print appropriate output when test aborted (hotpineapple) [#&#8203;59794](nodejs/node#59794)
- \[[`1eca2cc548`](nodejs/node@1eca2cc548)] - **tools**: use sparse checkout in `build-tarball.yml` (Antoine du Hamel) [#&#8203;59788](nodejs/node#59788)
- \[[`89fa1a929d`](nodejs/node@89fa1a929d)] - **tools**: remove unused actions from `build-tarball.yml` (Antoine du Hamel) [#&#8203;59787](nodejs/node#59787)
- \[[`794ca3511d`](nodejs/node@794ca3511d)] - **tools**: do not attempt to compress tgz archive (Antoine du Hamel) [#&#8203;59785](nodejs/node#59785)
- \[[`377bdb9b7e`](nodejs/node@377bdb9b7e)] - **tools**: add v8windbg target (Chengzhong Wu) [#&#8203;59767](nodejs/node#59767)
- \[[`6696d1d6c9`](nodejs/node@6696d1d6c9)] - **tools**: improve error handling in node\_mksnapshot (James M Snell) [#&#8203;59437](nodejs/node#59437)
- \[[`8dbd0f13e8`](nodejs/node@8dbd0f13e8)] - **tools**: add sccache to `test-internet` workflow (Antoine du Hamel) [#&#8203;59720](nodejs/node#59720)
- \[[`6523c2d7d9`](nodejs/node@6523c2d7d9)] - **tools**: update gyp-next to 0.20.4 (Node.js GitHub Bot) [#&#8203;59690](nodejs/node#59690)
- \[[`19d633f40c`](nodejs/node@19d633f40c)] - **tools**: add script to make reviewing backport MRs easier (Antoine du Hamel) [#&#8203;59161](nodejs/node#59161)
- \[[`15e547b3a4`](nodejs/node@15e547b3a4)] - **typings**: add typing for 'uv' (방진혁) [#&#8203;59606](nodejs/node#59606)
- \[[`ad5cfcc901`](nodejs/node@ad5cfcc901)] - **typings**: add missing properties in ConfigBinding (Lee Jiho) [#&#8203;59585](nodejs/node#59585)
- \[[`70d2d6d479`](nodejs/node@70d2d6d479)] - **url**: add err.input to ERR\_INVALID\_FILE\_URL\_PATH (Joyee Cheung) [#&#8203;59730](nodejs/node#59730)
- \[[`e476e43c17`](nodejs/node@e476e43c17)] - **util**: fix numericSeparator with negative fractional numbers (sangwook) [#&#8203;59379](nodejs/node#59379)
- \[[`b2e8f40d15`](nodejs/node@b2e8f40d15)] - **util**: remove unnecessary template strings (btea) [#&#8203;59201](nodejs/node#59201)
- \[[`6f79450ea2`](nodejs/node@6f79450ea2)] - **util**: remove outdated TODO comment (haramjeong) [#&#8203;59760](nodejs/node#59760)
- \[[`32731432ef`](nodejs/node@32731432ef)] - **util**: use getOptionValue('--no-deprecation') in deprecated() (haramjeong) [#&#8203;59760](nodejs/node#59760)
- \[[`65e4e68c90`](nodejs/node@65e4e68c90)] - **util**: hide duplicated stack frames when using util.inspect (Ruben Bridgewater) [#&#8203;59447](nodejs/node#59447)
- \[[`2086f3365f`](nodejs/node@2086f3365f)] - **vm**: sync-ify SourceTextModule linkage (Chengzhong Wu) [#&#8203;59000](nodejs/node#59000)
- \[[`c16163511d`](nodejs/node@c16163511d)] - **wasi**: fix `clean` target in `test/wasi/Makefile` (Antoine du Hamel) [#&#8203;59576](nodejs/node#59576)
- \[[`2e54411cb6`](nodejs/node@2e54411cb6)] - **worker**: optimize cpu profile implement (theanarkh) [#&#8203;59683](nodejs/node#59683)
- \[[`d6d05ba397`](nodejs/node@d6d05ba397)] - **(SEMVER-MINOR)** **worker**: add cpu profile APIs for worker (theanarkh) [#&#8203;59428](nodejs/node#59428)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45OS45IiwidXBkYXRlZEluVmVyIjoiNDEuOTkuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
richardlau pushed a commit that referenced this pull request Sep 20, 2025
When calling `process.exit()` or on uncaught exceptions as soon as the
process starts, the process will try to terminate immediately. In this
case, there could be a race condition on the unfinished off-thread
system CA loader which tries to access the OpenSSL API which has been
de-inited on the main thread.

PR-URL: #59632
Refs: #59550
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
author ready PRs that have at least one approval, no pending requests for changes, and a CI started. c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants