From b9c94ada34cbd6731e6c4fe9e3ab3f66ee48f366 Mon Sep 17 00:00:00 2001 From: Thomas Guillemard Date: Wed, 4 Sep 2019 18:10:15 +0200 Subject: [PATCH] timezone: improve sanity checks on TimeZone Rule name (#758) --- .../HOS/Services/Time/TimeZone/TimeZone.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs index 4898b2b97..4b4826896 100644 --- a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs +++ b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs @@ -197,6 +197,11 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { num = 0; + if (namePosition >= name.Length) + { + return false; + } + char c = name[namePosition]; if (!char.IsDigit(c)) @@ -212,7 +217,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone return false; } - c = name[++namePosition]; + if (++namePosition >= name.Length) + { + return false; + } + + c = name[namePosition]; } while (char.IsDigit(c)); @@ -237,6 +247,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone } seconds = num * SecondsPerHour; + + if (namePosition >= name.Length) + { + return false; + } + if (name[namePosition] == ':') { namePosition++; @@ -247,6 +263,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone } seconds += num * SecondsPerMinute; + + if (namePosition >= name.Length) + { + return false; + } + if (name[namePosition] == ':') { namePosition++; @@ -266,6 +288,11 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { bool isNegative = false; + if (namePosition >= name.Length) + { + return false; + } + if (name[namePosition] == '-') { isNegative = true; @@ -276,6 +303,11 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone namePosition++; } + if (namePosition >= name.Length) + { + return false; + } + bool isValid = GetSeconds(name, ref namePosition, out offset); if (!isValid) {