From 51fa1b2cb0bb54c0eb235c9d1fa68a7e1abaf464 Mon Sep 17 00:00:00 2001 From: Mary Date: Mon, 25 Oct 2021 00:13:20 +0200 Subject: hle: Improve safety (#2778) * timezone: Make timezone implementation safe * hle: Do not use TrimEnd to parse ASCII strings This adds an util that handle reading an ASCII string in a safe way. Previously it was possible to read malformed data that could cause various undefined behaviours in multiple services. * hid: Remove an useless unsafe modifier on keyboard update * Address gdkchan's comment * Address gdkchan's comment --- .../HOS/Services/Time/StaticService/ITimeZoneServiceForGlue.cs | 5 +++-- .../HOS/Services/Time/StaticService/ITimeZoneServiceForPsc.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'Ryujinx.HLE/HOS/Services/Time/StaticService') diff --git a/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForGlue.cs b/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForGlue.cs index da806ab6..98d4b617 100644 --- a/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForGlue.cs +++ b/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForGlue.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Services.Time.TimeZone; +using Ryujinx.HLE.Utilities; using System; using System.Text; @@ -35,7 +36,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService return ResultCode.PermissionDenied; } - string locationName = Encoding.ASCII.GetString(context.RequestData.ReadBytes(0x24)).TrimEnd('\0'); + string locationName = StringUtils.ReadInlinedAsciiString(context.RequestData, 0x24); return _timeZoneContentManager.SetDeviceLocationName(locationName); } @@ -97,7 +98,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService throw new InvalidOperationException(); } - string locationName = Encoding.ASCII.GetString(context.RequestData.ReadBytes(0x24)).TrimEnd('\0'); + string locationName = StringUtils.ReadInlinedAsciiString(context.RequestData, 0x24); ResultCode resultCode = _timeZoneContentManager.LoadTimeZoneRule(out TimeZoneRule rules, locationName); diff --git a/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForPsc.cs b/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForPsc.cs index d0ed9379..83d745e3 100644 --- a/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForPsc.cs +++ b/Ryujinx.HLE/HOS/Services/Time/StaticService/ITimeZoneServiceForPsc.cs @@ -125,7 +125,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService (ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21(); - string locationName = Encoding.ASCII.GetString(context.RequestData.ReadBytes(0x24)).TrimEnd('\0'); + string locationName = StringUtils.ReadInlinedAsciiString(context.RequestData, 0x24); ResultCode result; -- cgit v1.2.3