serenity/Kernel/Syscalls/disown.cpp
Andreas Kling 6132193bd4 Kernel: Make sys$disown not require the big lock
This syscall had a TOCTOU where it checked the peer's PPID before
locking the protected data (where the PPID is stored).

After closing the race window, we can mark the syscall as not needing
the big lock.
2023-04-04 10:33:42 +02:00

27 lines
676 B
C++

/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/Process.h>
namespace Kernel {
ErrorOr<FlatPtr> Process::sys$disown(ProcessID pid)
{
VERIFY_NO_PROCESS_BIG_LOCK(this);
TRY(require_promise(Pledge::proc));
auto process = Process::from_pid_in_same_jail(pid);
if (!process)
return ESRCH;
TRY(process->with_mutable_protected_data([this](auto& protected_data) -> ErrorOr<void> {
if (protected_data.ppid != this->pid())
return ECHILD;
protected_data.ppid = 0;
return {};
}));
process->disowned_by_waiter(*this);
return 0;
}
}