[Hotfix] hid: Prevent out of bounds array access (#5547)

* hid: Prevent out of bounds array access

* Cast player to uint

* Replace lambda function with local function
This commit is contained in:
TSRBerry 2023-08-10 05:29:15 +02:00 committed by GitHub
parent 5e9678c8fa
commit fe15c77d30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 16 deletions

View file

@ -70,6 +70,11 @@ namespace Ryujinx.HLE.HOS.Services.Hid
internal void SetSupportedPlayer(PlayerIndex player, bool supported = true) internal void SetSupportedPlayer(PlayerIndex player, bool supported = true)
{ {
if ((uint)player >= _supportedPlayers.Length)
{
return;
}
_supportedPlayers[(int)player] = supported; _supportedPlayers[(int)player] = supported;
} }

View file

@ -48,7 +48,22 @@ namespace Ryujinx.Tests.Cpu
bool methodCalled = false; bool methodCalled = false;
bool isFz = false; bool isFz = false;
var managedMethod = () => var method = TranslatorTestMethods.GenerateFpFlagsPInvokeTest();
// This method sets flush-to-zero and then calls the managed method.
// Before and after setting the flags, it ensures subnormal addition works as expected.
// It returns a positive result if any tests fail, and 0 on success (or if the platform cannot change FP flags)
int result = method(Marshal.GetFunctionPointerForDelegate(ManagedMethod));
// Subnormal results are not flushed to zero by default, which we should have returned to exiting the method.
Assert.AreNotEqual(GetDenormal() + GetZero(), 0f);
Assert.True(result == 0);
Assert.True(methodCalled);
Assert.True(isFz);
return;
void ManagedMethod()
{ {
// Floating point math should not modify fp flags. // Floating point math should not modify fp flags.
float test = 2f * 3.5f; float test = 2f * 3.5f;
@ -73,21 +88,7 @@ namespace Ryujinx.Tests.Cpu
methodCalled = true; methodCalled = true;
} }
}; }
var method = TranslatorTestMethods.GenerateFpFlagsPInvokeTest();
// This method sets flush-to-zero and then calls the managed method.
// Before and after setting the flags, it ensures subnormal addition works as expected.
// It returns a positive result if any tests fail, and 0 on success (or if the platform cannot change FP flags)
int result = method(Marshal.GetFunctionPointerForDelegate(managedMethod));
// Subnormal results are not flushed to zero by default, which we should have returned to exiting the method.
Assert.AreNotEqual(GetDenormal() + GetZero(), 0f);
Assert.True(result == 0);
Assert.True(methodCalled);
Assert.True(isFz);
} }
} }
} }