diff --git a/Libraries/LibIPC/TransportHandle.cpp b/Libraries/LibIPC/TransportHandle.cpp index 302a34c67db..88ac5b9f49d 100644 --- a/Libraries/LibIPC/TransportHandle.cpp +++ b/Libraries/LibIPC/TransportHandle.cpp @@ -18,16 +18,10 @@ TransportHandle::TransportHandle(File file) { } -ErrorOr TransportHandle::from_transport(Transport& transport) -{ - auto fd = TRY(transport.release_underlying_transport_for_transfer()); - return TransportHandle { File::adopt_fd(fd) }; -} - ErrorOr> TransportHandle::create_transport() const { auto socket = TRY(Core::LocalSocket::adopt_fd(m_file.take_fd())); - TRY(socket->set_blocking(true)); + TRY(socket->set_blocking(false)); return make(move(socket)); } diff --git a/Libraries/LibIPC/TransportHandle.h b/Libraries/LibIPC/TransportHandle.h index 57cb9aa9788..83708cf4d32 100644 --- a/Libraries/LibIPC/TransportHandle.h +++ b/Libraries/LibIPC/TransportHandle.h @@ -31,13 +31,11 @@ public: TransportHandle(TransportHandle&&) = default; TransportHandle& operator=(TransportHandle&&) = default; - static ErrorOr from_transport(Transport& transport); - ErrorOr> create_transport() const; -private: explicit TransportHandle(File); +private: template friend ErrorOr encode(Encoder&, U const&); diff --git a/Libraries/LibIPC/TransportSocket.cpp b/Libraries/LibIPC/TransportSocket.cpp index 6c48568eabf..4e3209aa9a5 100644 --- a/Libraries/LibIPC/TransportSocket.cpp +++ b/Libraries/LibIPC/TransportSocket.cpp @@ -12,7 +12,9 @@ #include #include #include +#include #include +#include #include #include @@ -31,14 +33,13 @@ ErrorOr TransportSocket::create_paired() TRY(socket0->set_close_on_exec(true)); TRY(socket0->set_blocking(false)); - auto socket1 = TRY(Core::LocalSocket::adopt_fd(fds[1])); + TRY(Core::System::set_close_on_exec(fds[1], true)); guard_fd_1.disarm(); - TRY(socket1->set_close_on_exec(true)); - TRY(socket1->set_blocking(false)); + // Local side gets a full transport; remote side is just a handle containing the raw fd for transfer to another process. return Paired { make(move(socket0)), - make(move(socket1)), + TransportHandle { File::adopt_fd(fds[1]) }, }; } @@ -504,10 +505,11 @@ TransportSocket::ShouldShutdown TransportSocket::read_as_many_messages_as_possib return m_peer_eof ? ShouldShutdown::Yes : ShouldShutdown::No; } -ErrorOr TransportSocket::release_underlying_transport_for_transfer() +ErrorOr TransportSocket::release_for_transfer() { stop_io_thread(IOThreadState::SendPendingMessagesAndStop); - return m_socket->release_fd(); + auto fd = TRY(m_socket->release_fd()); + return TransportHandle { File::adopt_fd(fd) }; } } diff --git a/Libraries/LibIPC/TransportSocket.h b/Libraries/LibIPC/TransportSocket.h index 39bbade95ae..39fb3f4073e 100644 --- a/Libraries/LibIPC/TransportSocket.h +++ b/Libraries/LibIPC/TransportSocket.h @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include @@ -43,7 +43,7 @@ public: struct Paired { NonnullOwnPtr local; - NonnullOwnPtr remote; + TransportHandle remote_handle; }; static ErrorOr create_paired(); @@ -70,8 +70,7 @@ public: }; ShouldShutdown read_as_many_messages_as_possible_without_blocking(Function&&); - // Obnoxious name to make it clear that this is a dangerous operation. - ErrorOr release_underlying_transport_for_transfer(); + ErrorOr release_for_transfer(); private: enum class TransferState { diff --git a/Libraries/LibIPC/TransportSocketWindows.cpp b/Libraries/LibIPC/TransportSocketWindows.cpp index 98f3ad6f67f..236b1d1c8b4 100644 --- a/Libraries/LibIPC/TransportSocketWindows.cpp +++ b/Libraries/LibIPC/TransportSocketWindows.cpp @@ -10,8 +10,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -31,14 +33,12 @@ ErrorOr TransportSocketWindows::create_paired() TRY(socket0->set_close_on_exec(true)); TRY(socket0->set_blocking(false)); - auto socket1 = TRY(Core::LocalSocket::adopt_fd(fds[1])); + TRY(Core::System::set_close_on_exec(fds[1], true)); guard_fd_1.disarm(); - TRY(socket1->set_close_on_exec(true)); - TRY(socket1->set_blocking(false)); return Paired { make(move(socket0)), - make(move(socket1)), + TransportHandle { File::adopt_fd(fds[1]) }, }; } @@ -272,9 +272,10 @@ TransportSocketWindows::ShouldShutdown TransportSocketWindows::read_as_many_mess return should_shutdown; } -ErrorOr TransportSocketWindows::release_underlying_transport_for_transfer() +ErrorOr TransportSocketWindows::release_for_transfer() { - return m_socket->release_fd(); + auto fd = TRY(m_socket->release_fd()); + return TransportHandle { File::adopt_fd(fd) }; } } diff --git a/Libraries/LibIPC/TransportSocketWindows.h b/Libraries/LibIPC/TransportSocketWindows.h index 6cac173cbba..0841fa6d1e4 100644 --- a/Libraries/LibIPC/TransportSocketWindows.h +++ b/Libraries/LibIPC/TransportSocketWindows.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace IPC { @@ -20,7 +21,7 @@ class TransportSocketWindows { public: struct Paired { NonnullOwnPtr local; - NonnullOwnPtr remote; + TransportHandle remote_handle; }; static ErrorOr create_paired(); @@ -46,8 +47,7 @@ public: }; ShouldShutdown read_as_many_messages_as_possible_without_blocking(Function&&); - // Obnoxious name to make it clear that this is a dangerous operation. - ErrorOr release_underlying_transport_for_transfer(); + ErrorOr release_for_transfer(); private: ErrorOr duplicate_handles(Bytes, Vector const& handle_offsets); diff --git a/Libraries/LibWeb/HTML/MessagePort.cpp b/Libraries/LibWeb/HTML/MessagePort.cpp index 4ac979f96ce..f5eb068b26a 100644 --- a/Libraries/LibWeb/HTML/MessagePort.cpp +++ b/Libraries/LibWeb/HTML/MessagePort.cpp @@ -8,13 +8,12 @@ #include #include -#include #include #include #include #include -#include #include +#include #include #include #include @@ -107,13 +106,12 @@ WebIDL::ExceptionOr MessagePort::transfer_steps(HTML::TransferDataEncoder& if (m_remote_port) m_remote_port->m_has_been_shipped = true; - auto fd = MUST(m_transport->release_underlying_transport_for_transfer()); + auto handle = MUST(m_transport->release_for_transfer()); m_transport.clear(); // 2. Set dataHolder.[[RemotePort]] to remotePort. - // TODO: Mach IPC data_holder.encode(IPC_FILE_TAG); - data_holder.encode(IPC::File::adopt_fd(fd)); + data_holder.encode(handle); } // 4. Otherwise, set dataHolder.[[RemotePort]] to null. else { @@ -135,9 +133,8 @@ WebIDL::ExceptionOr MessagePort::transfer_receiving_steps(HTML::TransferDa // 3. If dataHolder.[[RemotePort]] is not null, then entangle dataHolder.[[RemotePort]] and value. // (This will disentangle dataHolder.[[RemotePort]] from the original port that was transferred.) if (auto fd_tag = data_holder.decode(); fd_tag == IPC_FILE_TAG) { - // TODO: Mach IPC - auto fd = data_holder.decode(); - m_transport = make(MUST(Core::LocalSocket::adopt_fd(fd.take_fd()))); + auto handle = data_holder.decode(); + m_transport = MUST(handle.create_transport()); m_transport->set_up_read_hook([strong_this = GC::make_root(this)]() { if (strong_this->m_enabled) @@ -185,7 +182,7 @@ void MessagePort::entangle_with(MessagePort& remote_port) auto paired = MUST(IPC::Transport::create_paired()); m_transport = move(paired.local); - m_remote_port->m_transport = move(paired.remote); + m_remote_port->m_transport = MUST(paired.remote_handle.create_transport()); m_transport->set_up_read_hook([strong_this = GC::make_root(this)]() { if (strong_this->m_enabled) diff --git a/Libraries/LibWebView/WebContentClient.cpp b/Libraries/LibWebView/WebContentClient.cpp index 96b2a6f5c98..7749d8425c8 100644 --- a/Libraries/LibWebView/WebContentClient.cpp +++ b/Libraries/LibWebView/WebContentClient.cpp @@ -791,7 +791,7 @@ Messages::WebContentClient::RequestWorkerAgentResponse WebContentClient::request auto request_server_handle = MUST(connect_new_request_server_client()); auto image_decoder_handle = MUST(connect_new_image_decoder_client()); auto worker_client = MUST(WebView::launch_web_worker_process(worker_type)); - auto worker_handle = MUST(IPC::TransportHandle::from_transport(worker_client->transport())); + auto worker_handle = MUST(worker_client->transport().release_for_transfer()); return { move(worker_handle), move(request_server_handle), move(image_decoder_handle) }; } diff --git a/Libraries/LibWebView/WebUI.cpp b/Libraries/LibWebView/WebUI.cpp index c4ebf5cf227..d016f75787b 100644 --- a/Libraries/LibWebView/WebUI.cpp +++ b/Libraries/LibWebView/WebUI.cpp @@ -17,7 +17,7 @@ template static ErrorOr> create_web_ui(WebContentClient& client, String host) { auto paired = TRY(IPC::Transport::create_paired()); - auto handle = TRY(IPC::TransportHandle::from_transport(*paired.remote)); + auto handle = move(paired.remote_handle); auto web_ui = WebUIType::create(client, move(paired.local), move(host)); client.async_connect_to_web_ui(0, move(handle)); diff --git a/Services/ImageDecoder/ConnectionFromClient.cpp b/Services/ImageDecoder/ConnectionFromClient.cpp index 3a5ec97ffb1..4031019c96b 100644 --- a/Services/ImageDecoder/ConnectionFromClient.cpp +++ b/Services/ImageDecoder/ConnectionFromClient.cpp @@ -58,7 +58,7 @@ Messages::ImageDecoderServer::InitTransportResponse ConnectionFromClient::init_t ErrorOr ConnectionFromClient::connect_new_client() { auto paired = TRY(IPC::Transport::create_paired()); - auto handle = TRY(IPC::TransportHandle::from_transport(*paired.remote)); + auto handle = move(paired.remote_handle); // Note: A ref is stored in the static s_connections map auto client = adopt_ref(*new ConnectionFromClient(move(paired.local))); diff --git a/Services/RequestServer/ConnectionFromClient.cpp b/Services/RequestServer/ConnectionFromClient.cpp index 3312f879906..613a65fbff5 100644 --- a/Services/RequestServer/ConnectionFromClient.cpp +++ b/Services/RequestServer/ConnectionFromClient.cpp @@ -141,7 +141,7 @@ Messages::RequestServer::ConnectNewClientsResponse ConnectionFromClient::connect ErrorOr ConnectionFromClient::create_client_socket() { auto paired = TRY(IPC::Transport::create_paired()); - auto handle = TRY(IPC::TransportHandle::from_transport(*paired.remote)); + auto handle = move(paired.remote_handle); // Note: A ref is stored in the m_connections map auto client = adopt_ref(*new ConnectionFromClient(move(paired.local), IsPrimaryConnection::No, m_connections, m_disk_cache));