mirror of
https://git.h3cjp.net/H3cJP/yuzu.git
synced 2024-12-15 15:25:31 +00:00
kernel/svc: Sanitize core number and thread priorities in CreateThread()
Now that we handle the kernel capability descriptors we can correct CreateThread to properly check against the core and priority masks like the actual kernel does.
This commit is contained in:
parent
8769604144
commit
3a8d38be7e
|
@ -1219,12 +1219,6 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
|
||||||
"threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}",
|
"threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}",
|
||||||
entry_point, arg, stack_top, priority, processor_id, *out_handle);
|
entry_point, arg, stack_top, priority, processor_id, *out_handle);
|
||||||
|
|
||||||
if (priority > THREADPRIO_LOWEST) {
|
|
||||||
LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
|
|
||||||
THREADPRIO_LOWEST, priority);
|
|
||||||
return ERR_INVALID_THREAD_PRIORITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto* const current_process = Core::CurrentProcess();
|
auto* const current_process = Core::CurrentProcess();
|
||||||
|
|
||||||
if (processor_id == THREADPROCESSORID_IDEAL) {
|
if (processor_id == THREADPROCESSORID_IDEAL) {
|
||||||
|
@ -1238,6 +1232,23 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
|
||||||
return ERR_INVALID_PROCESSOR_ID;
|
return ERR_INVALID_PROCESSOR_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const u64 core_mask = current_process->GetCoreMask();
|
||||||
|
if ((core_mask | (1ULL << processor_id)) != core_mask) {
|
||||||
|
LOG_ERROR(Kernel_SVC, "Invalid thread core specified ({})", processor_id);
|
||||||
|
return ERR_INVALID_PROCESSOR_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priority > THREADPRIO_LOWEST) {
|
||||||
|
LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
|
||||||
|
THREADPRIO_LOWEST, priority);
|
||||||
|
return ERR_INVALID_THREAD_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((1ULL << priority) & current_process->GetPriorityMask()) == 0) {
|
||||||
|
LOG_ERROR(Kernel_SVC, "Invalid thread priority specified ({})", priority);
|
||||||
|
return ERR_INVALID_THREAD_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string name = fmt::format("thread-{:X}", entry_point);
|
const std::string name = fmt::format("thread-{:X}", entry_point);
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
CASCADE_RESULT(SharedPtr<Thread> thread,
|
CASCADE_RESULT(SharedPtr<Thread> thread,
|
||||||
|
|
Loading…
Reference in a new issue