mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-23 18:02:05 -05:00
6132193bd4
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.
27 lines
676 B
C++
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;
|
|
}
|
|
}
|