From 3581ac18ea9929ff3e16bf52154e64ccd99ef950 Mon Sep 17 00:00:00 2001 From: Tarek Mahmoud Sayed Date: Wed, 16 Aug 2017 12:46:38 -0700 Subject: [PATCH] Fix resource lookup recursion issue --- .../src/System/Globalization/CultureInfo.cs | 46 +++++++++++++------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/mscorlib/src/System/Globalization/CultureInfo.cs b/src/mscorlib/src/System/Globalization/CultureInfo.cs index d620d2dc24a5..d5cbc239f777 100644 --- a/src/mscorlib/src/System/Globalization/CultureInfo.cs +++ b/src/mscorlib/src/System/Globalization/CultureInfo.cs @@ -339,6 +339,24 @@ public CultureInfo(String name, bool useUserOverride) { this.m_isInherited = (this.GetType() != typeof(System.Globalization.CultureInfo)); } + private CultureInfo(CultureData cultureData) + { + Contract.Assert(cultureData != null); + m_cultureData = cultureData; + m_name = cultureData.CultureName; + m_isInherited = false; + } + + private static CultureInfo CreateCultureInfoNoThrow(string name, bool useUserOverride) + { + Contract.Assert(name != null); + CultureData cultureData = CultureData.GetCultureData(name, useUserOverride); + if (cultureData == null) + { + return null; + } + return new CultureInfo(cultureData); + } #if FEATURE_USE_LCID public CultureInfo(int culture) : this(culture, true) { @@ -922,27 +940,25 @@ public virtual CultureInfo Parent if (null == m_parent) { - try - { - string parentName = this.m_cultureData.SPARENT; + string parentName = this.m_cultureData.SPARENT; - if (String.IsNullOrEmpty(parentName)) + if (String.IsNullOrEmpty(parentName)) + { + m_parent = InvariantCulture; + } + else + { + m_parent = CreateCultureInfoNoThrow(parentName, m_cultureData.UseUserOverride); + if (m_parent == null) { + // For whatever reason our IPARENT or SPARENT wasn't correct, so use invariant + // We can't allow ourselves to fail. In case of custom cultures the parent of the + // current custom culture isn't installed. m_parent = InvariantCulture; } - else - { - m_parent = new CultureInfo(parentName, this.m_cultureData.UseUserOverride); - } - } - catch (ArgumentException) - { - // For whatever reason our IPARENT or SPARENT wasn't correct, so use invariant - // We can't allow ourselves to fail. In case of custom cultures the parent of the - // current custom culture isn't installed. - m_parent = InvariantCulture; } } + return m_parent; } }