[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)
{
if ((uint)player >= _supportedPlayers.Length)
{
return;
}
_supportedPlayers[(int)player] = supported;
}

View file

@ -48,7 +48,22 @@ namespace Ryujinx.Tests.Cpu
bool methodCalled = 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.
float test = 2f * 3.5f;
@ -73,21 +88,7 @@ namespace Ryujinx.Tests.Cpu
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);
}
}
}
}