From 7a33c1f95f147f179830206e89fcc36a5a058f2c Mon Sep 17 00:00:00 2001 From: BoiledElectricity Date: Fri, 5 Jun 2026 00:03:38 -0400 Subject: [PATCH] [hid_core] fix: bounds-check aruid index in GetControllerFromNpadIdType 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 --- src/hid_core/resources/npad/npad.cpp | 12 ++++++++++-- 1 file 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]; }