diff options
| author | 2023-07-14 22:32:24 -0400 | |
|---|---|---|
| committer | 2023-07-22 11:19:29 -0400 | |
| commit | 9f3f615e054663fd6e538fa2db86271b467a6bfd (patch) | |
| tree | 1c826b4de5fc2b51cbade16a6fedb969df8b437d /src/core/hle/kernel | |
| parent | memory: minimize dependency on process (diff) | |
| download | yuzu-9f3f615e054663fd6e538fa2db86271b467a6bfd.tar.gz yuzu-9f3f615e054663fd6e538fa2db86271b467a6bfd.tar.xz yuzu-9f3f615e054663fd6e538fa2db86271b467a6bfd.zip | |
core: reduce TOCTTOU memory access
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/svc/svc_ipc.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_synchronization.cpp | 11 |
2 files changed, 8 insertions, 14 deletions
diff --git a/src/core/hle/kernel/svc/svc_ipc.cpp b/src/core/hle/kernel/svc/svc_ipc.cpp index bb94f6934..373ae7c8d 100644 --- a/src/core/hle/kernel/svc/svc_ipc.cpp +++ b/src/core/hle/kernel/svc/svc_ipc.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "core/hle/kernel/k_process.h" | 8 | #include "core/hle/kernel/k_process.h" |
| 9 | #include "core/hle/kernel/k_server_session.h" | 9 | #include "core/hle/kernel/k_server_session.h" |
| 10 | #include "core/hle/kernel/svc.h" | 10 | #include "core/hle/kernel/svc.h" |
| 11 | #include "core/hle/kernel/svc_results.h" | ||
| 11 | 12 | ||
| 12 | namespace Kernel::Svc { | 13 | namespace Kernel::Svc { |
| 13 | 14 | ||
| @@ -49,14 +50,10 @@ Result ReplyAndReceive(Core::System& system, s32* out_index, uint64_t handles_ad | |||
| 49 | 50 | ||
| 50 | // Copy user handles. | 51 | // Copy user handles. |
| 51 | if (num_handles > 0) { | 52 | if (num_handles > 0) { |
| 52 | // Ensure we can try to get the handles. | ||
| 53 | R_UNLESS(GetCurrentMemory(kernel).IsValidVirtualAddressRange( | ||
| 54 | handles_addr, static_cast<u64>(sizeof(Handle) * num_handles)), | ||
| 55 | ResultInvalidPointer); | ||
| 56 | |||
| 57 | // Get the handles. | 53 | // Get the handles. |
| 58 | GetCurrentMemory(kernel).ReadBlock(handles_addr, handles.data(), | 54 | R_UNLESS(GetCurrentMemory(kernel).ReadBlock(handles_addr, handles.data(), |
| 59 | sizeof(Handle) * num_handles); | 55 | sizeof(Handle) * num_handles), |
| 56 | ResultInvalidPointer); | ||
| 60 | 57 | ||
| 61 | // Convert the handles to objects. | 58 | // Convert the handles to objects. |
| 62 | R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>( | 59 | R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>( |
diff --git a/src/core/hle/kernel/svc/svc_synchronization.cpp b/src/core/hle/kernel/svc/svc_synchronization.cpp index f02d03f30..366e8ed4a 100644 --- a/src/core/hle/kernel/svc/svc_synchronization.cpp +++ b/src/core/hle/kernel/svc/svc_synchronization.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "core/hle/kernel/k_process.h" | 7 | #include "core/hle/kernel/k_process.h" |
| 8 | #include "core/hle/kernel/k_readable_event.h" | 8 | #include "core/hle/kernel/k_readable_event.h" |
| 9 | #include "core/hle/kernel/svc.h" | 9 | #include "core/hle/kernel/svc.h" |
| 10 | #include "core/hle/kernel/svc_results.h" | ||
| 10 | 11 | ||
| 11 | namespace Kernel::Svc { | 12 | namespace Kernel::Svc { |
| 12 | 13 | ||
| @@ -64,14 +65,10 @@ Result WaitSynchronization(Core::System& system, int32_t* out_index, u64 user_ha | |||
| 64 | 65 | ||
| 65 | // Copy user handles. | 66 | // Copy user handles. |
| 66 | if (num_handles > 0) { | 67 | if (num_handles > 0) { |
| 67 | // Ensure we can try to get the handles. | ||
| 68 | R_UNLESS(GetCurrentMemory(kernel).IsValidVirtualAddressRange( | ||
| 69 | user_handles, static_cast<u64>(sizeof(Handle) * num_handles)), | ||
| 70 | ResultInvalidPointer); | ||
| 71 | |||
| 72 | // Get the handles. | 68 | // Get the handles. |
| 73 | GetCurrentMemory(kernel).ReadBlock(user_handles, handles.data(), | 69 | R_UNLESS(GetCurrentMemory(kernel).ReadBlock(user_handles, handles.data(), |
| 74 | sizeof(Handle) * num_handles); | 70 | sizeof(Handle) * num_handles), |
| 71 | ResultInvalidPointer); | ||
| 75 | 72 | ||
| 76 | // Convert the handles to objects. | 73 | // Convert the handles to objects. |
| 77 | R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>( | 74 | R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>( |