summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-12-31 11:10:05 -0500
committerGravatar GitHub2018-12-31 11:10:05 -0500
commit09ffa0cb21fa5421934bfa3f69ba9226a345e193 (patch)
treeabe7a8e46dedee288fd91e6de02496169d381a2a /src/core/hle/kernel/svc.cpp
parentMerge pull request #1965 from lioncash/fmt (diff)
parentkernel/svc: Correct misleading error message within CreateThread() (diff)
downloadyuzu-09ffa0cb21fa5421934bfa3f69ba9226a345e193.tar.gz
yuzu-09ffa0cb21fa5421934bfa3f69ba9226a345e193.tar.xz
yuzu-09ffa0cb21fa5421934bfa3f69ba9226a345e193.zip
Merge pull request #1967 from lioncash/thread
kernel/svc: Sanitize core and priority masks within CreateThread
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp48
1 files changed, 27 insertions, 21 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 660e6f577..6588bd3b8 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -715,8 +715,8 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
715 715
716 enum class GetInfoType : u64 { 716 enum class GetInfoType : u64 {
717 // 1.0.0+ 717 // 1.0.0+
718 AllowedCpuIdBitmask = 0, 718 AllowedCPUCoreMask = 0,
719 AllowedThreadPrioBitmask = 1, 719 AllowedThreadPriorityMask = 1,
720 MapRegionBaseAddr = 2, 720 MapRegionBaseAddr = 2,
721 MapRegionSize = 3, 721 MapRegionSize = 3,
722 HeapRegionBaseAddr = 4, 722 HeapRegionBaseAddr = 4,
@@ -747,8 +747,8 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
747 const auto info_id_type = static_cast<GetInfoType>(info_id); 747 const auto info_id_type = static_cast<GetInfoType>(info_id);
748 748
749 switch (info_id_type) { 749 switch (info_id_type) {
750 case GetInfoType::AllowedCpuIdBitmask: 750 case GetInfoType::AllowedCPUCoreMask:
751 case GetInfoType::AllowedThreadPrioBitmask: 751 case GetInfoType::AllowedThreadPriorityMask:
752 case GetInfoType::MapRegionBaseAddr: 752 case GetInfoType::MapRegionBaseAddr:
753 case GetInfoType::MapRegionSize: 753 case GetInfoType::MapRegionSize:
754 case GetInfoType::HeapRegionBaseAddr: 754 case GetInfoType::HeapRegionBaseAddr:
@@ -774,12 +774,12 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
774 } 774 }
775 775
776 switch (info_id_type) { 776 switch (info_id_type) {
777 case GetInfoType::AllowedCpuIdBitmask: 777 case GetInfoType::AllowedCPUCoreMask:
778 *result = process->GetAllowedProcessorMask(); 778 *result = process->GetCoreMask();
779 return RESULT_SUCCESS; 779 return RESULT_SUCCESS;
780 780
781 case GetInfoType::AllowedThreadPrioBitmask: 781 case GetInfoType::AllowedThreadPriorityMask:
782 *result = process->GetAllowedThreadPriorityMask(); 782 *result = process->GetPriorityMask();
783 return RESULT_SUCCESS; 783 return RESULT_SUCCESS;
784 784
785 case GetInfoType::MapRegionBaseAddr: 785 case GetInfoType::MapRegionBaseAddr:
@@ -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) {
@@ -1233,17 +1227,29 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
1233 ASSERT(processor_id != THREADPROCESSORID_IDEAL); 1227 ASSERT(processor_id != THREADPROCESSORID_IDEAL);
1234 } 1228 }
1235 1229
1236 switch (processor_id) { 1230 if (processor_id < THREADPROCESSORID_0 || processor_id > THREADPROCESSORID_3) {
1237 case THREADPROCESSORID_0:
1238 case THREADPROCESSORID_1:
1239 case THREADPROCESSORID_2:
1240 case THREADPROCESSORID_3:
1241 break;
1242 default:
1243 LOG_ERROR(Kernel_SVC, "Invalid thread processor ID: {}", processor_id); 1231 LOG_ERROR(Kernel_SVC, "Invalid thread processor ID: {}", processor_id);
1244 return ERR_INVALID_PROCESSOR_ID; 1232 return ERR_INVALID_PROCESSOR_ID;
1245 } 1233 }
1246 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,
1243 "Invalid thread priority specified ({}). Must be within the range 0-64",
1244 priority);
1245 return ERR_INVALID_THREAD_PRIORITY;
1246 }
1247
1248 if (((1ULL << priority) & current_process->GetPriorityMask()) == 0) {
1249 LOG_ERROR(Kernel_SVC, "Invalid thread priority specified ({})", priority);
1250 return ERR_INVALID_THREAD_PRIORITY;
1251 }
1252
1247 const std::string name = fmt::format("thread-{:X}", entry_point); 1253 const std::string name = fmt::format("thread-{:X}", entry_point);
1248 auto& kernel = Core::System::GetInstance().Kernel(); 1254 auto& kernel = Core::System::GetInstance().Kernel();
1249 CASCADE_RESULT(SharedPtr<Thread> thread, 1255 CASCADE_RESULT(SharedPtr<Thread> thread,