1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 02:35:09 +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) NonnullRefPtr<FileDescription> FIFO::open_direction(FIFO::Direction direction)
{ {
auto description = FileDescription::create(this); auto description = FileDescription::create(*this);
attach(direction); attach(direction);
description->set_fifo_direction({}, direction); description->set_fifo_direction({}, direction);
return description; return description;

View file

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

View file

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

View file

@ -22,8 +22,8 @@ class SharedMemory;
class FileDescription : public RefCounted<FileDescription> { class FileDescription : public RefCounted<FileDescription> {
public: public:
static NonnullRefPtr<FileDescription> create(RefPtr<Custody>&&); static NonnullRefPtr<FileDescription> create(Custody&);
static NonnullRefPtr<FileDescription> create(RefPtr<File>, SocketRole = SocketRole::None); static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
~FileDescription(); ~FileDescription();
NonnullRefPtr<FileDescription> clone(); NonnullRefPtr<FileDescription> clone();
@ -106,12 +106,12 @@ public:
private: private:
friend class VFS; friend class VFS;
FileDescription(RefPtr<File>&&, SocketRole = SocketRole::None); FileDescription(File&, SocketRole = SocketRole::None);
FileDescription(FIFO&, FIFO::Direction); FileDescription(FIFO&, FIFO::Direction);
RefPtr<Custody> m_custody; RefPtr<Custody> m_custody;
RefPtr<Inode> m_inode; RefPtr<Inode> m_inode;
RefPtr<File> m_file; NonnullRefPtr<File> m_file;
off_t m_current_offset { 0 }; 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); ASSERT(accepted_socket);
bool success = accepted_socket->get_peer_address(address, address_size); bool success = accepted_socket->get_peer_address(address, address_size);
ASSERT(success); 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. // 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. // 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()); 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); auto shm_or_error = SharedMemory::open(String(name), flags, mode);
if (shm_or_error.is_error()) if (shm_or_error.is_error())
return shm_or_error.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); m_fds[fd].set(move(description), FD_CLOEXEC);
return fd; return fd;
} }

View file

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