summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-30 21:20:07 -0500
committerGravatar Lioncash2018-12-30 21:23:56 -0500
commit3a8d38be7e584d1fba5f35f1e4e4449f40fa2073 (patch)
tree6a3bade5daf2447bbf6e3888b7a66def0183650f /src/core/hle/kernel/svc.cpp
parentkernel/process: Rename GetAllowedProcessorMask() and GetAllowedThreadPriority... (diff)
downloadyuzu-3a8d38be7e584d1fba5f35f1e4e4449f40fa2073.tar.gz
yuzu-3a8d38be7e584d1fba5f35f1e4e4449f40fa2073.tar.xz
yuzu-3a8d38be7e584d1fba5f35f1e4e4449f40fa2073.zip
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.
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 8d8d4e0ab..ada05abd2 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1219,12 +1219,6 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
1219 "threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}", 1219 "threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}",
1220 entry_point, arg, stack_top, priority, processor_id, *out_handle); 1220 entry_point, arg, stack_top, priority, processor_id, *out_handle);
1221 1221
1222 if (priority > THREADPRIO_LOWEST) {
1223 LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
1224 THREADPRIO_LOWEST, priority);
1225 return ERR_INVALID_THREAD_PRIORITY;
1226 }
1227
1228 auto* const current_process = Core::CurrentProcess(); 1222 auto* const current_process = Core::CurrentProcess();
1229 1223
1230 if (processor_id == THREADPROCESSORID_IDEAL) { 1224 if (processor_id == THREADPROCESSORID_IDEAL) {
@@ -1238,6 +1232,23 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
1238 return ERR_INVALID_PROCESSOR_ID; 1232 return ERR_INVALID_PROCESSOR_ID;
1239 } 1233 }
1240 1234
1235 const u64 core_mask = current_process->GetCoreMask();
1236 if ((core_mask | (1ULL << processor_id)) != core_mask) {
1237 LOG_ERROR(Kernel_SVC, "Invalid thread core specified ({})", processor_id);
1238 return ERR_INVALID_PROCESSOR_ID;
1239 }
1240
1241 if (priority > THREADPRIO_LOWEST) {
1242 LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
1243 THREADPRIO_LOWEST, priority);
1244 return ERR_INVALID_THREAD_PRIORITY;
1245 }
1246
1247 if (((1ULL << priority) & current_process->GetPriorityMask()) == 0) {
1248 LOG_ERROR(Kernel_SVC, "Invalid thread priority specified ({})", priority);
1249 return ERR_INVALID_THREAD_PRIORITY;
1250 }
1251
1241 const std::string name = fmt::format("thread-{:X}", entry_point); 1252 const std::string name = fmt::format("thread-{:X}", entry_point);
1242 auto& kernel = Core::System::GetInstance().Kernel(); 1253 auto& kernel = Core::System::GetInstance().Kernel();
1243 CASCADE_RESULT(SharedPtr<Thread> thread, 1254 CASCADE_RESULT(SharedPtr<Thread> thread,