diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 7473ca9a6c..0caaa56df4 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -238,7 +238,6 @@ Process::Process(RefPtr& first_thread, const String& name, uid_t uid, gi , m_executable(move(executable)) , m_cwd(move(cwd)) , m_tty(tty) - , m_ppid(ppid) , m_wait_block_condition(*this) { m_protected_data = KBuffer::try_create_with_size(sizeof(ProtectedData)); @@ -247,6 +246,7 @@ Process::Process(RefPtr& first_thread, const String& name, uid_t uid, gi { MutableProtectedData protected_data { *this }; protected_data->pid = allocate_pid(); + protected_data->ppid = ppid; protected_data->uid = uid; protected_data->gid = gid; protected_data->euid = uid; @@ -518,7 +518,7 @@ void Process::finalize() { // FIXME: PID/TID BUG - if (auto parent_thread = Thread::from_tid(m_ppid.value())) { + if (auto parent_thread = Thread::from_tid(ppid().value())) { if (!(parent_thread->m_signal_action_data[SIGCHLD].flags & SA_NOCLDWAIT)) parent_thread->send_signal(SIGCHLD, this); } diff --git a/Kernel/Process.h b/Kernel/Process.h index c2b4511e1f..ddfdce1fec 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -114,6 +114,7 @@ class Process struct ProtectedData { ProcessID pid { 0 }; + ProcessID ppid { 0 }; SessionID sid { 0 }; uid_t euid { 0 }; gid_t egid { 0 }; @@ -209,7 +210,7 @@ public: gid_t gid() const { return protected_data().gid; } uid_t suid() const { return protected_data().suid; } gid_t sgid() const { return protected_data().sgid; } - ProcessID ppid() const { return m_ppid; } + ProcessID ppid() const { return protected_data().ppid; } bool is_dumpable() const { return m_dumpable; } void set_dumpable(bool dumpable) { m_dumpable = dumpable; } @@ -587,7 +588,6 @@ private: RefPtr m_tty; - ProcessID m_ppid { 0 }; mode_t m_umask { 022 }; bool m_dumpable { true }; diff --git a/Kernel/Syscalls/disown.cpp b/Kernel/Syscalls/disown.cpp index 0a0408dc39..8d9ee0754f 100644 --- a/Kernel/Syscalls/disown.cpp +++ b/Kernel/Syscalls/disown.cpp @@ -36,7 +36,7 @@ KResultOr Process::sys$disown(ProcessID pid) return ESRCH; if (process->ppid() != this->pid()) return ECHILD; - process->m_ppid = 0; + MutableProtectedData(*this)->ppid = 0; process->disowned_by_waiter(*this); return 0; } diff --git a/Kernel/Syscalls/process.cpp b/Kernel/Syscalls/process.cpp index e604641965..06301d94f6 100644 --- a/Kernel/Syscalls/process.cpp +++ b/Kernel/Syscalls/process.cpp @@ -38,7 +38,7 @@ KResultOr Process::sys$getpid() KResultOr Process::sys$getppid() { REQUIRE_PROMISE(stdio); - return m_ppid.value(); + return protected_data().ppid.value(); } KResultOr Process::sys$get_process_name(Userspace buffer, size_t buffer_size)