diff options
author | Mikhail Kurinnoi/AI Compiler Lab /SRR/Staff Engineer/Samsung Electronics <m.kurinnoi@samsung.com> | 2020-06-26 01:30:09 +0300 |
---|---|---|
committer | 이형주/Common Platform Lab(SR)/Staff Engineer/삼성전자 <leee.lee@samsung.com> | 2020-06-26 07:30:09 +0900 |
commit | 5cd177b448ff1c61c7899647f729e44fef78f142 (patch) | |
tree | 7f591434c95a8fbd066dcd58c566345770a14fcf /src | |
parent | 5c97d445ae987d03d3e9f588272260b7ec683ddd (diff) | |
download | coreclr-5cd177b448ff1c61c7899647f729e44fef78f142.tar.gz coreclr-5cd177b448ff1c61c7899647f729e44fef78f142.tar.bz2 coreclr-5cd177b448ff1c61c7899647f729e44fef78f142.zip |
Fix TPA map hash calculation. (#288)
* Fix TPA map hash calculation.
The point of issue is "the Turkish-I Problem". After locale changed, towupper() provide another result for "i" and different hash are calculated in case if file name have "i" letter.
* Regression test for #37910
Diffstat (limited to 'src')
3 files changed, 57 insertions, 2 deletions
diff --git a/src/binder/inc/applicationcontext.hpp b/src/binder/inc/applicationcontext.hpp index 83893f33ce..f315b32c0d 100644 --- a/src/binder/inc/applicationcontext.hpp +++ b/src/binder/inc/applicationcontext.hpp @@ -71,8 +71,12 @@ namespace BINDER_SPACE key = e.m_wszSimpleName; return key; } - static count_t Hash(const key_t &str) { return HashiString(str); } - static BOOL Equals(const key_t &lhs, const key_t &rhs) { LIMITED_METHOD_CONTRACT; return (_wcsicmp(lhs, rhs) == 0); } + static count_t Hash(const key_t &str) + { + SString ssKey(SString::Literal, str); + return ssKey.HashCaseInsensitive(); + } + static BOOL Equals(const key_t &lhs, const key_t &rhs) { LIMITED_METHOD_CONTRACT; return (SString::_wcsicmp(lhs, rhs) == 0); } void OnDestructPerEntryCleanupAction(const SimpleNameToFileNameMapEntry & e) { diff --git a/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.cs b/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.cs new file mode 100644 index 0000000000..65f0ea68c0 --- /dev/null +++ b/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +public class Program +{ + [DllImport("libc", EntryPoint = "setlocale")] + public static extern IntPtr setlocale(int category, [MarshalAs(UnmanagedType.LPStr)] string locale); + + public static int Main() + { + Assembly a1 = Assembly.GetExecutingAssembly(); + + // In case of Turkish locale: + // towupper 'i' -> \x0130 (instead of 'I') + // towlower 'I' -> \x0131 (instead of 'i') + const string TRLocale = "tr_TR.UTF-8"; + IntPtr res = setlocale(6 /*LC_ALL*/, TRLocale); + if (TRLocale != Marshal.PtrToStringAnsi(res)) + { + Console.WriteLine("Failed! " + TRLocale + " locale was not found in system!"); + return -1; + } + + Assembly a2 = Assembly.Load("Ii"); + + if (a1 != a2) + { + Console.WriteLine("Failed!"); + return -2; + } + + Console.WriteLine("Passed!"); + return 100; + } +} diff --git a/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.csproj b/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.csproj new file mode 100644 index 0000000000..d1d1441426 --- /dev/null +++ b/src/coreclr/tests/src/Loader/binding/assemblies/assemblybugs/37910/Ii.csproj @@ -0,0 +1,12 @@ +<Project Sdk="Microsoft.NET.Sdk"> + <PropertyGroup> + <OutputType>Exe</OutputType> + <CLRTestKind>BuildAndRun</CLRTestKind> + <CLRTestPriority>1</CLRTestPriority> + <!-- Test unsupported outside of linux --> + <CLRTestTargetUnsupported Condition="'$(TargetOS)' != 'Linux'">true</CLRTestTargetUnsupported> + </PropertyGroup> + <ItemGroup> + <Compile Include="Ii.cs" /> + </ItemGroup> +</Project> |