From 26ce8ad40faeb2d3524ce3fb01eacbca1918eafc Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Tue, 16 Apr 2024 13:26:00 -0600 Subject: [PATCH] LibWeb: Stop leaking socket fds when sending them over IPC The implicit constructor for IPC::File does not take ownership of the file, which is surprising. --- Userland/Libraries/LibWeb/HTML/MessagePort.cpp | 4 ++-- Userland/Libraries/LibWeb/Worker/WebWorkerClient.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/MessagePort.cpp b/Userland/Libraries/LibWeb/HTML/MessagePort.cpp index 2f5c9b05169..9c95839ce0b 100644 --- a/Userland/Libraries/LibWeb/HTML/MessagePort.cpp +++ b/Userland/Libraries/LibWeb/HTML/MessagePort.cpp @@ -80,12 +80,12 @@ WebIDL::ExceptionOr MessagePort::transfer_steps(HTML::TransferDataHolder& // 2. Set dataHolder.[[RemotePort]] to remotePort. auto fd = MUST(m_socket->release_fd()); m_socket = nullptr; - data_holder.fds.append(fd); + data_holder.fds.append(IPC::File(fd, IPC::File::CloseAfterSending)); data_holder.data.append(IPC_FILE_TAG); auto fd_passing_socket = MUST(m_fd_passing_socket->release_fd()); m_fd_passing_socket = nullptr; - data_holder.fds.append(fd_passing_socket); + data_holder.fds.append(IPC::File(fd_passing_socket, IPC::File::CloseAfterSending)); data_holder.data.append(IPC_FILE_TAG); } diff --git a/Userland/Libraries/LibWeb/Worker/WebWorkerClient.cpp b/Userland/Libraries/LibWeb/Worker/WebWorkerClient.cpp index 02d85764b39..418f97fd57e 100644 --- a/Userland/Libraries/LibWeb/Worker/WebWorkerClient.cpp +++ b/Userland/Libraries/LibWeb/Worker/WebWorkerClient.cpp @@ -22,8 +22,8 @@ WebWorkerClient::WebWorkerClient(NonnullOwnPtr socket) WebView::SocketPair WebWorkerClient::dup_sockets() { WebView::SocketPair pair; - pair.socket = MUST(Core::System::dup(socket().fd().value())); - pair.fd_passing_socket = MUST(Core::System::dup(fd_passing_socket().fd().value())); + pair.socket = IPC::File(MUST(Core::System::dup(socket().fd().value())), IPC::File::CloseAfterSending); + pair.fd_passing_socket = IPC::File(MUST(Core::System::dup(fd_passing_socket().fd().value())), IPC::File::CloseAfterSending); return pair; }