-
-
Notifications
You must be signed in to change notification settings - Fork 34.6k
Make --use-system-ca per-env rather than per-process #60678
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Review requested:
|
d87558c to
23473b9
Compare
|
Hmm, I think this may need more work than just updating the options - the implication of being per-env is that each worker would then be able to toggle this independently. Say when the main thread does not enable it but a worker does, then the worker will have the system CA certs in their default store but the parent doesn't. Can you add a test for this, and the other way around (parent enables it, worker disables it)? My impression is that the default store initialisation code is not yet ready for this and it's still shared across the process (so if a worker enables it, suddenly the parent get it too, which would be unexpected). |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #60678 +/- ##
==========================================
- Coverage 89.78% 89.76% -0.02%
==========================================
Files 673 674 +1
Lines 203775 204104 +329
Branches 39166 39230 +64
==========================================
+ Hits 182956 183221 +265
- Misses 13139 13205 +66
+ Partials 7680 7678 -2
🚀 New features to boost your workflow:
|
f22457c to
780c272
Compare
38913f9 to
d9fb49d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add some tests to test/parallel that checks this affects tls.getCACertificates('default') in a worker if tls.getCACertificates('system') returns non-empty in a parent? (if there are no system CAs in the testing machine, then the test can be skipped - that way it can run even without the mock certificates installed)
77856be to
d8281c4
Compare
test/parallel/test-tls-get-ca-certificates-worker-use-system-ca.js
Outdated
Show resolved
Hide resolved
test/parallel/test-tls-get-ca-certificates-worker-use-system-ca.js
Outdated
Show resolved
Hide resolved
d8281c4 to
5d7dc6b
Compare
5d7dc6b to
00f4b51
Compare
00f4b51 to
aa9f038
Compare
| TLSContext::TLSContext(Side side, const Options& options) | ||
| : side_(side), options_(options), ctx_(Initialize()) {} | ||
| TLSContext::TLSContext(Environment* env, Side side, const Options& options) | ||
| : side_(side), options_(options), env_(env), ctx_(Initialize()) {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this initialization is buggy, env_ is declared after ctx_, and member initialization order follows declaration order, not the order in this list, so in Initialize(), env_ is not initialized - this can probably be fixed by just passing the env into Initialize instead (which I think is better because it's more explicit), or just switch the declaration order.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, from what I see, the env_ is declared before the ctx_. Although, I guess std::string validation_error_ = ""; should be moved above ctx_. But if you prefer, I can change this to pass env into Initialise instead
| return root_cert_store; | ||
| } | ||
| root_cert_store = NewRootCertStore(); | ||
| root_cert_store = NewRootCertStore(env); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this now leaks a X509_STORE for every worker upon shutdown. Previously this was okay because there's only ever one store in the process, but now they come and go with workers. Also while Node.js executable doesn't do this usually, embedders (including cctests) reuse a thread for different Environments, so the store may go stale when the thread gets reused by another Environment. This probably fixes it:
| root_cert_store = NewRootCertStore(env); | |
| root_cert_store = NewRootCertStore(env); | |
| env->AddCleanupHook([](void* arg) { | |
| if (root_cert_store != nullptr) { | |
| X509_STORE_free(root_cert_store); | |
| root_cert_store = nullptr; | |
| } | |
| }, nullptr); |
Makes the
--use-system-caoption a per-environment option rather than a per-process option so that workers can enable/disable them individually