Ver código fonte

Kernel: Fix cloning file descriptions on fork

After a fork, the parent and the child are supposed to share
the same file description. For example, modifying the current
offset of a file description is visible in both of them.
Sergey Bugaev 6 anos atrás
pai
commit
1606261c58

+ 0 - 18
Kernel/FileSystem/FileDescription.cpp

@@ -57,24 +57,6 @@ void FileDescription::set_socket_role(SocketRole role)
     socket()->attach(*this);
 }
 
-NonnullRefPtr<FileDescription> FileDescription::clone()
-{
-    RefPtr<FileDescription> description;
-    if (is_fifo()) {
-        description = fifo()->open_direction(m_fifo_direction);
-    } else {
-        description = FileDescription::create(m_file, m_socket_role);
-        description->m_custody = m_custody;
-        description->m_inode = m_inode;
-    }
-    ASSERT(description);
-    description->m_current_offset = m_current_offset;
-    description->m_is_blocking = m_is_blocking;
-    description->m_should_append = m_should_append;
-    description->m_file_flags = m_file_flags;
-    return *description;
-}
-
 KResult FileDescription::fstat(stat& buffer)
 {
     ASSERT(!is_fifo());

+ 0 - 2
Kernel/FileSystem/FileDescription.h

@@ -26,8 +26,6 @@ public:
     static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
     ~FileDescription();
 
-    NonnullRefPtr<FileDescription> clone();
-
     int close();
 
     off_t seek(off_t, int whence);

+ 1 - 2
Kernel/Process.cpp

@@ -624,8 +624,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
 #ifdef FORK_DEBUG
             dbgprintf("fork: cloning fd %u... (%p) istty? %u\n", i, fork_parent->m_fds[i].description.ptr(), fork_parent->m_fds[i].description->is_tty());
 #endif
-            m_fds[i].description = fork_parent->m_fds[i].description->clone();
-            m_fds[i].flags = fork_parent->m_fds[i].flags;
+            m_fds[i] = fork_parent->m_fds[i];
         }
     } else {
         m_fds.resize(m_max_open_file_descriptors);