Kernel: Use Userspace<T> in sched_setparam syscall

Note: I switched from copying the single element out of the sched_param
struct, to copy struct it self as it is identical in functionality.
This way the types match up nicer with the Userpace<T> api's and it
conforms to the conventions used in other syscalls.
This commit is contained in:
Brian Gianforcaro 2020-08-01 18:06:29 -07:00 committed by Andreas Kling
parent 1209bf82c1
commit 10e912d68c
Notes: sideshowbarker 2024-07-19 04:24:10 +09:00
2 changed files with 8 additions and 7 deletions

View File

@ -291,7 +291,7 @@ public:
int sys$setsockopt(const Syscall::SC_setsockopt_params*); int sys$setsockopt(const Syscall::SC_setsockopt_params*);
int sys$getsockname(const Syscall::SC_getsockname_params*); int sys$getsockname(const Syscall::SC_getsockname_params*);
int sys$getpeername(const Syscall::SC_getpeername_params*); int sys$getpeername(const Syscall::SC_getpeername_params*);
int sys$sched_setparam(pid_t pid, const struct sched_param* param); int sys$sched_setparam(pid_t pid, Userspace<const struct sched_param*>);
int sys$sched_getparam(pid_t pid, struct sched_param* param); int sys$sched_getparam(pid_t pid, struct sched_param* param);
int sys$create_thread(void* (*)(void*), const Syscall::SC_create_thread_params*); int sys$create_thread(void* (*)(void*), const Syscall::SC_create_thread_params*);
void sys$exit_thread(void*); void sys$exit_thread(void*);

View File

@ -48,14 +48,14 @@ int Process::sys$donate(int tid)
return 0; return 0;
} }
int Process::sys$sched_setparam(int tid, const struct sched_param* param) int Process::sys$sched_setparam(int tid, Userspace<const struct sched_param*> user_param)
{ {
REQUIRE_PROMISE(proc); REQUIRE_PROMISE(proc);
if (!validate_read_typed(param)) if (!validate_read_typed(user_param))
return -EFAULT; return -EFAULT;
int desired_priority; struct sched_param desired_param;
copy_from_user(&desired_priority, &param->sched_priority); copy_from_user(&desired_param, user_param);
InterruptDisabler disabler; InterruptDisabler disabler;
auto* peer = Thread::current(); auto* peer = Thread::current();
@ -68,10 +68,11 @@ int Process::sys$sched_setparam(int tid, const struct sched_param* param)
if (!is_superuser() && m_euid != peer->process().m_uid && m_uid != peer->process().m_uid) if (!is_superuser() && m_euid != peer->process().m_uid && m_uid != peer->process().m_uid)
return -EPERM; return -EPERM;
if (desired_priority < THREAD_PRIORITY_MIN || desired_priority > THREAD_PRIORITY_MAX) if (desired_param.sched_priority < THREAD_PRIORITY_MIN ||
desired_param.sched_priority > THREAD_PRIORITY_MAX)
return -EINVAL; return -EINVAL;
peer->set_priority((u32)desired_priority); peer->set_priority((u32)desired_param.sched_priority);
return 0; return 0;
} }