diff options
| author | BoiledElectricity <james.dellamorte@gmail.com> | 2026-06-05 19:26:21 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-06-05 19:26:21 +0200 |
| commit | 470d43df6da19e5f48687087f1a8cc378bbe90ee (patch) | |
| tree | 289d64b7db25d516fb818338f8a785a1a5f07841 /src/hid_core | |
| parent | fb6330645a06a3e0d9e6fa42a4e6f875d9ee065e (diff) | |
[hid_core] fix bounds-check aruid index in GetControllerFromNpadIdType (#4064)
GetIndexFromAruid returns AruidIndexMax as the “not found” value, but both
GetControllerFromNpadIdType overloads were using that value to index
controller_data without checking it first.
when a game routes through DisconnectNpad before its applet resource is
registered, we can end up indexing past the end of controller_data. That seems
to be what was crashing some games on launch, especially on macOS and Android,
where the out-of-bounds read is less likely to just slide by unnoticed.
So yeah, AruidIndexMax is a sentinel, not a real controller_data index, so we
should not treat it like one.
Fixes: https://github.com/eden-emulator/Issue-Reports/issues/438
Fixes: https://github.com/eden-emulator/Issue-Reports/issues/439
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4064
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/hid_core')
| -rw-r--r-- | src/hid_core/resources/npad/npad.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 4710342848..04d8a85301 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1144,7 +1144,11 @@ NPad::NpadControllerData& NPad::GetControllerFromNpadIdType(u64 aruid, npad_id = Core::HID::NpadIdType::Player1; } const auto npad_index = NpadIdTypeToIndex(npad_id); - const auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); + auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); + if (aruid_index >= AruidIndexMax) { + LOG_ERROR(Service_HID, "Invalid aruid:{:016X}", aruid); + aruid_index = 0; + } return controller_data[aruid_index][npad_index]; } @@ -1155,7 +1159,11 @@ const NPad::NpadControllerData& NPad::GetControllerFromNpadIdType( npad_id = Core::HID::NpadIdType::Player1; } const auto npad_index = NpadIdTypeToIndex(npad_id); - const auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); + auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); + if (aruid_index >= AruidIndexMax) { + LOG_ERROR(Service_HID, "Invalid aruid:{:016X}", aruid); + aruid_index = 0; + } return controller_data[aruid_index][npad_index]; } |
