diff options
author | Andreas Kling <kling@serenityos.org> | 2023-04-03 13:39:11 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-04-04 10:33:42 +0200 |
commit | 41f5598516012dad3b799de98254cd7303dc3555 (patch) | |
tree | 039adc603184958839d0b71e4bfe8341a90f2712 /Kernel | |
parent | 13824392678d7f78d65f4cbed44ffaa546cac6fc (diff) | |
download | serenity-41f5598516012dad3b799de98254cd7303dc3555.zip |
Kernel: Make sys$getsid not require the big lock
Reorganize the code slightly to avoid creating a TOCTOU bug, then mark
the syscall as not needing the big lock anymore.
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/API/Syscall.h | 2 | ||||
-rw-r--r-- | Kernel/Syscalls/setpgid.cpp | 13 |
2 files changed, 8 insertions, 7 deletions
diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 00a56a5d20..de3985fe98 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -104,7 +104,7 @@ enum class NeedsBigProcessLock { S(getresgid, NeedsBigProcessLock::No) \ S(getresuid, NeedsBigProcessLock::No) \ S(getrusage, NeedsBigProcessLock::Yes) \ - S(getsid, NeedsBigProcessLock::Yes) \ + S(getsid, NeedsBigProcessLock::No) \ S(getsockname, NeedsBigProcessLock::Yes) \ S(getsockopt, NeedsBigProcessLock::No) \ S(gettid, NeedsBigProcessLock::No) \ diff --git a/Kernel/Syscalls/setpgid.cpp b/Kernel/Syscalls/setpgid.cpp index 39dc2b4d94..8812f86c92 100644 --- a/Kernel/Syscalls/setpgid.cpp +++ b/Kernel/Syscalls/setpgid.cpp @@ -12,16 +12,17 @@ namespace Kernel { ErrorOr<FlatPtr> Process::sys$getsid(pid_t pid) { - VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); + VERIFY_NO_PROCESS_BIG_LOCK(this); TRY(require_promise(Pledge::stdio)); - if (pid == 0) + if (pid == 0 || pid == this->pid()) return sid().value(); - auto process = Process::from_pid_in_same_jail(pid); - if (!process) + auto peer = Process::from_pid_in_same_jail(pid); + if (!peer) return ESRCH; - if (sid() != process->sid()) + auto peer_sid = peer->sid(); + if (sid() != peer_sid) return EPERM; - return process->sid().value(); + return peer_sid.value(); } ErrorOr<FlatPtr> Process::sys$setsid() |