diff --git a/Userland/Libraries/LibIPC/Connection.h b/Userland/Libraries/LibIPC/Connection.h index 01464b2f16..260919ad7b 100644 --- a/Userland/Libraries/LibIPC/Connection.h +++ b/Userland/Libraries/LibIPC/Connection.h @@ -65,8 +65,8 @@ public: buffer.data.prepend(reinterpret_cast(&message_size), sizeof(message_size)); #ifdef __serenity__ - for (int fd : buffer.fds) { - auto rc = sendfd(m_socket->fd(), fd); + for (auto& fd : buffer.fds) { + auto rc = sendfd(m_socket->fd(), fd->value()); if (rc < 0) { perror("sendfd"); shutdown(); diff --git a/Userland/Libraries/LibIPC/Encoder.cpp b/Userland/Libraries/LibIPC/Encoder.cpp index ee1132dde3..f067ae80d8 100644 --- a/Userland/Libraries/LibIPC/Encoder.cpp +++ b/Userland/Libraries/LibIPC/Encoder.cpp @@ -148,7 +148,16 @@ Encoder& Encoder::operator<<(const Dictionary& dictionary) Encoder& Encoder::operator<<(const File& file) { - m_buffer.fds.append(file.fd()); + int fd = file.fd(); + if (fd != -1) { + auto result = dup(fd); + if (result < 0) { + perror("dup"); + VERIFY_NOT_REACHED(); + } + fd = result; + } + m_buffer.fds.append(adopt_ref(*new AutoCloseFileDescriptor(fd))); return *this; } diff --git a/Userland/Libraries/LibIPC/Message.h b/Userland/Libraries/LibIPC/Message.h index c483909700..0cb74bdde1 100644 --- a/Userland/Libraries/LibIPC/Message.h +++ b/Userland/Libraries/LibIPC/Message.h @@ -7,13 +7,34 @@ #pragma once #include +#include #include +#include namespace IPC { +class AutoCloseFileDescriptor : public RefCounted { +public: + AutoCloseFileDescriptor(int fd) + : m_fd(fd) + { + } + + ~AutoCloseFileDescriptor() + { + if (m_fd != -1) + close(m_fd); + } + + int value() const { return m_fd; } + +private: + int m_fd; +}; + struct MessageBuffer { Vector data; - Vector fds; + Vector> fds; }; class Message {