Ver Fonte

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.
Andreas Kling há 6 anos atrás
pai
commit
752de9cd27

+ 1 - 1
Kernel/FileSystem/FIFO.cpp

@@ -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;

+ 1 - 1
Kernel/FileSystem/File.cpp

@@ -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()

+ 9 - 10
Kernel/FileSystem/FileDescription.cpp

@@ -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;
 }
 

+ 4 - 4
Kernel/FileSystem/FileDescription.h

@@ -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 };
 

+ 2 - 2
Kernel/Process.cpp

@@ -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;
 }

+ 1 - 1
Kernel/TTY/PTYMultiplexer.cpp

@@ -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)