summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2023-04-03 13:39:11 +0200
committerAndreas Kling <kling@serenityos.org>2023-04-04 10:33:42 +0200
commit41f5598516012dad3b799de98254cd7303dc3555 (patch)
tree039adc603184958839d0b71e4bfe8341a90f2712 /Kernel
parent13824392678d7f78d65f4cbed44ffaa546cac6fc (diff)
downloadserenity-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.h2
-rw-r--r--Kernel/Syscalls/setpgid.cpp13
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()