diff options
| author | 2018-12-31 11:10:05 -0500 | |
|---|---|---|
| committer | 2018-12-31 11:10:05 -0500 | |
| commit | 09ffa0cb21fa5421934bfa3f69ba9226a345e193 (patch) | |
| tree | abe7a8e46dedee288fd91e6de02496169d381a2a /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #1965 from lioncash/fmt (diff) | |
| parent | kernel/svc: Correct misleading error message within CreateThread() (diff) | |
| download | yuzu-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.cpp | 48 |
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, |