From b4425de2228e3ea15d3405aa360eee80c425259a Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Fri, 22 Mar 2024 16:51:57 +0100 Subject: [PATCH] LibTLS: Avoid using new event loops when setting up connections This was causing some racey behaviour in LibHTTP, and just generally lead to really bad stack traces; avoid that by switching to Core::Promise and using the existing event loop. Possibly resolves #23524 and #23642. --- Userland/Libraries/LibTLS/Socket.cpp | 32 +++++++++++----------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/Userland/Libraries/LibTLS/Socket.cpp b/Userland/Libraries/LibTLS/Socket.cpp index 0d2e21e362f86f..b11b2a1a600f02 100644 --- a/Userland/Libraries/LibTLS/Socket.cpp +++ b/Userland/Libraries/LibTLS/Socket.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -51,45 +52,38 @@ ErrorOr TLSv12::write_some(ReadonlyBytes bytes) ErrorOr> TLSv12::connect(ByteString const& host, u16 port, Options options) { - Core::EventLoop loop; + auto promise = Core::Promise::construct(); OwnPtr tcp_socket = TRY(Core::TCPSocket::connect(host, port)); TRY(tcp_socket->set_blocking(false)); auto tls_socket = make(move(tcp_socket), move(options)); tls_socket->set_sni(host); tls_socket->on_connected = [&] { - loop.quit(0); + promise->resolve({}); }; tls_socket->on_tls_error = [&](auto alert) { - loop.quit(256 - to_underlying(alert)); + tls_socket->try_disambiguate_error(); + promise->reject(AK::Error::from_string_view(enum_to_string(alert))); }; - auto result = loop.exec(); - if (result == 0) - return tls_socket; - tls_socket->try_disambiguate_error(); - // FIXME: Should return richer information here. - return AK::Error::from_string_view(enum_to_string(static_cast(256 - result))); + TRY(promise->await()); + return tls_socket; } ErrorOr> TLSv12::connect(ByteString const& host, Core::Socket& underlying_stream, Options options) { + auto promise = Core::Promise::construct(); TRY(underlying_stream.set_blocking(false)); auto tls_socket = make(&underlying_stream, move(options)); tls_socket->set_sni(host); - Core::EventLoop loop; tls_socket->on_connected = [&] { - loop.quit(0); + promise->resolve({}); }; tls_socket->on_tls_error = [&](auto alert) { - loop.quit(256 - to_underlying(alert)); + tls_socket->try_disambiguate_error(); + promise->reject(AK::Error::from_string_view(enum_to_string(alert))); }; - auto result = loop.exec(); - if (result == 0) - return tls_socket; - - tls_socket->try_disambiguate_error(); - // FIXME: Should return richer information here. - return AK::Error::from_string_view(enum_to_string(static_cast(256 - result))); + TRY(promise->await()); + return tls_socket; } void TLSv12::setup_connection()