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:
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)
|
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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue