Skip to content

Commit

Permalink
LibIPC: Make sure FDs survive when passed into a MessageBuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarbeutner authored and awesomekling committed May 2, 2021
1 parent cc6db52 commit de9b454
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
4 changes: 2 additions & 2 deletions Userland/Libraries/LibIPC/Connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ class Connection : public Core::Object {
buffer.data.prepend(reinterpret_cast<const u8*>(&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();
Expand Down
11 changes: 10 additions & 1 deletion Userland/Libraries/LibIPC/Encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
23 changes: 22 additions & 1 deletion Userland/Libraries/LibIPC/Message.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,34 @@
#pragma once

#include <AK/Function.h>
#include <AK/RefPtr.h>
#include <AK/Vector.h>
#include <unistd.h>

namespace IPC {

class AutoCloseFileDescriptor : public RefCounted<AutoCloseFileDescriptor> {
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<u8, 1024> data;
Vector<int> fds;
Vector<RefPtr<AutoCloseFileDescriptor>> fds;
};

class Message {
Expand Down

0 comments on commit de9b454

Please sign in to comment.