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:
parent
0dc05a33c1
commit
752de9cd27
6 changed files with 18 additions and 19 deletions
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 };
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue