1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 11:35:10 +00:00

FileDescription: Disallow construction with a null File

It's not valid for a FileDescription to not have a file, so let's
disallow it by taking a File& (or FIFO&) in the constructor.
This commit is contained in:
Andreas Kling 2019-08-11 09:32:21 +02:00
parent 0dc05a33c1
commit 752de9cd27
6 changed files with 18 additions and 19 deletions

View file

@ -32,7 +32,7 @@ NonnullRefPtr<FIFO> FIFO::create(uid_t uid)
NonnullRefPtr<FileDescription> FIFO::open_direction(FIFO::Direction direction)
{
auto description = FileDescription::create(this);
auto description = FileDescription::create(*this);
attach(direction);
description->set_fifo_direction({}, direction);
return description;

View file

@ -12,7 +12,7 @@ File::~File()
KResultOr<NonnullRefPtr<FileDescription>> File::open(int options)
{
UNUSED_PARAM(options);
return FileDescription::create(this);
return FileDescription::create(*this);
}
void File::close()

View file

@ -15,23 +15,23 @@
#include <Kernel/VM/MemoryManager.h>
#include <LibC/errno_numbers.h>
NonnullRefPtr<FileDescription> FileDescription::create(RefPtr<Custody>&& custody)
NonnullRefPtr<FileDescription> FileDescription::create(Custody& custody)
{
auto description = adopt(*new FileDescription(InodeFile::create(custody->inode())));
description->m_custody = move(custody);
auto description = adopt(*new FileDescription(InodeFile::create(custody.inode())));
description->m_custody = custody;
return description;
}
NonnullRefPtr<FileDescription> FileDescription::create(RefPtr<File> file, SocketRole role)
NonnullRefPtr<FileDescription> FileDescription::create(File& file, SocketRole role)
{
return adopt(*new FileDescription(move(file), role));
return adopt(*new FileDescription(file, role));
}
FileDescription::FileDescription(RefPtr<File>&& file, SocketRole role)
: m_file(move(file))
FileDescription::FileDescription(File& file, SocketRole role)
: m_file(file)
{
if (m_file->is_inode())
m_inode = static_cast<InodeFile&>(*m_file).inode();
if (file.is_inode())
m_inode = static_cast<InodeFile&>(file).inode();
set_socket_role(role);
}
@ -42,7 +42,6 @@ FileDescription::~FileDescription()
if (is_fifo())
static_cast<FIFO*>(m_file.ptr())->detach(m_fifo_direction);
m_file->close();
m_file = nullptr;
m_inode = nullptr;
}

View file

@ -22,8 +22,8 @@ class SharedMemory;
class FileDescription : public RefCounted<FileDescription> {
public:
static NonnullRefPtr<FileDescription> create(RefPtr<Custody>&&);
static NonnullRefPtr<FileDescription> create(RefPtr<File>, SocketRole = SocketRole::None);
static NonnullRefPtr<FileDescription> create(Custody&);
static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
~FileDescription();
NonnullRefPtr<FileDescription> clone();
@ -106,12 +106,12 @@ public:
private:
friend class VFS;
FileDescription(RefPtr<File>&&, SocketRole = SocketRole::None);
FileDescription(File&, SocketRole = SocketRole::None);
FileDescription(FIFO&, FIFO::Direction);
RefPtr<Custody> m_custody;
RefPtr<Inode> m_inode;
RefPtr<File> m_file;
NonnullRefPtr<File> m_file;
off_t m_current_offset { 0 };

View file

@ -2169,7 +2169,7 @@ int Process::sys$accept(int accepting_socket_fd, sockaddr* address, socklen_t* a
ASSERT(accepted_socket);
bool success = accepted_socket->get_peer_address(address, address_size);
ASSERT(success);
auto accepted_socket_description = FileDescription::create(move(accepted_socket), SocketRole::Accepted);
auto accepted_socket_description = FileDescription::create(*accepted_socket, SocketRole::Accepted);
// NOTE: The accepted socket inherits fd flags from the accepting socket.
// I'm not sure if this matches other systems but it makes sense to me.
accepted_socket_description->set_blocking(accepting_socket_description->is_blocking());
@ -2652,7 +2652,7 @@ int Process::sys$shm_open(const char* name, int flags, mode_t mode)
auto shm_or_error = SharedMemory::open(String(name), flags, mode);
if (shm_or_error.is_error())
return shm_or_error.error();
auto description = FileDescription::create(shm_or_error.value().ptr());
auto description = FileDescription::create(shm_or_error.value());
m_fds[fd].set(move(description), FD_CLOEXEC);
return fd;
}

View file

@ -39,7 +39,7 @@ KResultOr<NonnullRefPtr<FileDescription>> PTYMultiplexer::open(int options)
#ifdef PTMX_DEBUG
dbgprintf("PTYMultiplexer::open: Vending master %u\n", master->index());
#endif
return FileDescription::create(master.ptr());
return FileDescription::create(move(master));
}
void PTYMultiplexer::notify_master_destroyed(Badge<MasterPTY>, unsigned index)