Skip to content

Commit 42d796f

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[dart:io, mac] Don't create a thread pool per secure socket.
TEST=ci Bug: flutter/flutter#170723 Change-Id: I381c0dac8f7e308830c8bba472e11fb20939708e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/436501 Reviewed-by: Brian Quinlan <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 886624c commit 42d796f

9 files changed

+46
-21
lines changed

runtime/bin/secure_socket_filter.cc

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <openssl/ssl.h>
1111
#include <openssl/x509.h>
1212

13+
#include "bin/io_service.h"
1314
#include "bin/lockers.h"
1415
#include "bin/secure_socket_utils.h"
1516
#include "bin/security_context.h"
@@ -34,6 +35,7 @@ bool SSLFilter::library_initialized_ = false;
3435
Mutex* SSLFilter::mutex_ = nullptr;
3536
int SSLFilter::filter_ssl_index;
3637
int SSLFilter::ssl_cert_context_index;
38+
Dart_Port SSLFilter::trust_evaluate_reply_port_ = ILLEGAL_PORT;
3739

3840
void SSLFilter::Init() {
3941
ASSERT(SSLFilter::mutex_ == nullptr);
@@ -44,6 +46,7 @@ void SSLFilter::Cleanup() {
4446
ASSERT(SSLFilter::mutex_ != nullptr);
4547
delete SSLFilter::mutex_;
4648
SSLFilter::mutex_ = nullptr;
49+
trust_evaluate_reply_port_ = ILLEGAL_PORT;
4750
}
4851

4952
const intptr_t SSLFilter::kInternalBIOSize = 10 * KB;
@@ -482,6 +485,17 @@ void SSLFilter::InitializeLibrary() {
482485
}
483486
}
484487

488+
Dart_Port SSLFilter::TrustEvaluateReplyPort() {
489+
MutexLocker locker(mutex_);
490+
if (trust_evaluate_reply_port_ == ILLEGAL_PORT) {
491+
trust_evaluate_reply_port_ =
492+
Dart_NewConcurrentNativePort("SSLCertContextTrustEvaluate",
493+
SSLCertContext::GetTrustEvaluateHandler(),
494+
IOService::max_concurrency());
495+
}
496+
return trust_evaluate_reply_port_;
497+
}
498+
485499
void SSLFilter::Connect(const char* hostname,
486500
SSLCertContext* context,
487501
bool is_server,
@@ -514,13 +528,6 @@ void SSLFilter::Connect(const char* hostname,
514528
context->RegisterCallbacks(ssl_);
515529
SSL_set_ex_data(ssl_, ssl_cert_context_index, context);
516530

517-
TrustEvaluateHandlerFunc trust_evaluate_handler =
518-
context->GetTrustEvaluateHandler();
519-
if (trust_evaluate_handler != nullptr) {
520-
trust_evaluate_reply_port_ = Dart_NewNativePort(
521-
"SSLCertContextTrustEvaluate", trust_evaluate_handler,
522-
/*handle_concurrently=*/false);
523-
}
524531
if (is_server_) {
525532
int certificate_mode =
526533
request_client_certificate ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
@@ -714,10 +721,6 @@ void SSLFilter::Destroy() {
714721
Dart_DeletePersistentHandle(bad_certificate_callback_);
715722
bad_certificate_callback_ = nullptr;
716723
}
717-
if (trust_evaluate_reply_port_ != ILLEGAL_PORT) {
718-
Dart_CloseNativePort(trust_evaluate_reply_port_);
719-
trust_evaluate_reply_port_ = ILLEGAL_PORT;
720-
}
721724
FreeResources();
722725
}
723726

runtime/bin/secure_socket_filter.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,13 @@ class SSLFilter : public ReferenceCounted<SSLFilter> {
115115
return certificate_trust_state_.get();
116116
}
117117
Dart_Port reply_port() const { return reply_port_; }
118-
Dart_Port trust_evaluate_reply_port() const {
119-
return trust_evaluate_reply_port_;
120-
}
118+
static Dart_Port TrustEvaluateReplyPort();
121119

122120
private:
123121
static const intptr_t kInternalBIOSize;
124122
static bool library_initialized_;
125123
static Mutex* mutex_; // To protect library initialization.
124+
static Dart_Port trust_evaluate_reply_port_;
126125

127126
SSL* ssl_;
128127
BIO* socket_side_;
@@ -143,7 +142,6 @@ class SSLFilter : public ReferenceCounted<SSLFilter> {
143142
char* hostname_;
144143

145144
Dart_Port reply_port_ = ILLEGAL_PORT;
146-
Dart_Port trust_evaluate_reply_port_ = ILLEGAL_PORT;
147145
Dart_Port key_log_port_ = ILLEGAL_PORT;
148146

149147
static bool IsBufferEncrypted(int i) {

runtime/bin/security_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class SSLCertContext : public ReferenceCounted<SSLCertContext> {
9191
void set_trust_builtin(bool trust_builtin) { trust_builtin_ = trust_builtin; }
9292

9393
void RegisterCallbacks(SSL* ssl);
94-
TrustEvaluateHandlerFunc GetTrustEvaluateHandler() const;
94+
static TrustEvaluateHandlerFunc GetTrustEvaluateHandler();
9595

9696
static bool long_ssl_cert_evaluation() { return long_ssl_cert_evaluation_; }
9797
static void set_long_ssl_cert_evaluation(bool long_ssl_cert_evaluation) {

runtime/bin/security_context_fuchsia.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void SSLCertContext::RegisterCallbacks(SSL* ssl) {
5050
// verification mechanism.
5151
}
5252

53-
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
53+
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() {
5454
return nullptr;
5555
}
5656

runtime/bin/security_context_linux.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void SSLCertContext::RegisterCallbacks(SSL* ssl) {
107107
// verification mechanism.
108108
}
109109

110-
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
110+
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() {
111111
return nullptr;
112112
}
113113

runtime/bin/security_context_macos.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ static ssl_verify_result_t CertificateVerificationCallback(SSL* ssl,
226226
&dart_cobject_root_cert, &reply_send_port};
227227
array.value.as_array.values = values;
228228

229-
Dart_PostCObject(filter->trust_evaluate_reply_port(), &array);
229+
Dart_PostCObject(SSLFilter::TrustEvaluateReplyPort(), &array);
230230
return ssl_verify_retry;
231231
}
232232

@@ -306,7 +306,7 @@ void SSLCertContext::RegisterCallbacks(SSL* ssl) {
306306
SSL_set_custom_verify(ssl, SSL_VERIFY_PEER, CertificateVerificationCallback);
307307
}
308308

309-
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
309+
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() {
310310
return &TrustEvaluateHandler;
311311
}
312312

runtime/bin/security_context_win.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void SSLCertContext::RegisterCallbacks(SSL* ssl) {
227227
// verification mechanism.
228228
}
229229

230-
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
230+
TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() {
231231
return nullptr;
232232
}
233233

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// https://github.com/flutter/flutter/issues/170723
6+
7+
import "dart:io";
8+
9+
test(int i) async {
10+
var socket = await RawSecureSocket.connect("www.google.com", 443);
11+
await Future.delayed(
12+
Duration(seconds: 6), // More than the thread pool timeout.
13+
);
14+
socket.close();
15+
}
16+
17+
main() async {
18+
var tests = <Future>[];
19+
for (var i = 0; i < 2000; i++) {
20+
tests.add(test(i));
21+
}
22+
await Future.wait(tests);
23+
}

tests/standalone/standalone_vm.status

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ no_allow_absolute_addresses_test: SkipByDesign # Not supported.
1414
io/file_stat_test: Skip # Issue 26376
1515
io/file_system_watcher_test: Skip # Issue 26376
1616
io/file_test: Skip # Issue 26376
17+
io/many_pending_secure_sockets_test: Skip # Too expensive
1718
io/non_utf8_output_test: Skip # The Android command runner doesn't correctly handle non-UTF8 formatted output. https://github.com/dart-lang/sdk/issues/28872
1819
io/process_exit_test: Skip # Issue 29578
1920
io/process_path_environment_test: Skip # Issue 26376

0 commit comments

Comments
 (0)