mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:17:34 +00:00
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.
This commit is contained in:
parent
2396b2ed70
commit
1606261c58
3 changed files with 1 additions and 22 deletions
|
@ -57,24 +57,6 @@ void FileDescription::set_socket_role(SocketRole role)
|
||||||
socket()->attach(*this);
|
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)
|
KResult FileDescription::fstat(stat& buffer)
|
||||||
{
|
{
|
||||||
ASSERT(!is_fifo());
|
ASSERT(!is_fifo());
|
||||||
|
|
|
@ -26,8 +26,6 @@ public:
|
||||||
static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
|
static NonnullRefPtr<FileDescription> create(File&, SocketRole = SocketRole::None);
|
||||||
~FileDescription();
|
~FileDescription();
|
||||||
|
|
||||||
NonnullRefPtr<FileDescription> clone();
|
|
||||||
|
|
||||||
int close();
|
int close();
|
||||||
|
|
||||||
off_t seek(off_t, int whence);
|
off_t seek(off_t, int whence);
|
||||||
|
|
|
@ -624,8 +624,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
|
||||||
#ifdef FORK_DEBUG
|
#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());
|
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
|
#endif
|
||||||
m_fds[i].description = fork_parent->m_fds[i].description->clone();
|
m_fds[i] = fork_parent->m_fds[i];
|
||||||
m_fds[i].flags = fork_parent->m_fds[i].flags;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_fds.resize(m_max_open_file_descriptors);
|
m_fds.resize(m_max_open_file_descriptors);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue