diff options
author | Jonathan Pryor <jonpryor@vt.edu> | 2013-03-07 07:36:24 +0400 |
---|---|---|
committer | Jonathan Pryor <jonpryor@vt.edu> | 2013-03-07 07:42:08 +0400 |
commit | 2d37d81770e4e4e822e1b076eb525f1591f9521a (patch) | |
tree | 737fc6b04924916689682128bcfd036645d31399 /mcs/class/Microsoft.Build.Engine | |
parent | 0ff40ae70aa2ffbdf61a9ebb5e47e4932864460a (diff) |
[xbuild] Replace string.ToLower() comparison with OrdinalIgnoreCase comparison
Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=10946
The scenario is the "turkish-i problem": Have an MSBuild Task Assembly
which calls ITaskItem.GetMetadata("Identity") (like, oh, the
Xamarin.Android build system...). Run in a Turkish locale (tr-TR), and
things fail badly:
Error executing task AndroidComputeResPaths: System.ArgumentException: Invalid reserved metadata name
at Mono.XBuild.Utilities.ReservedNameUtils.GetReservedMetadata (System.String itemSpec, System.String metadataName, IDictionary metadata) [0x00000] in <filename unknown>:0
at Microsoft.Build.Utilities.TaskItem.GetMetadata (System.String metadataName) [0x00000] in <filename unknown>:0
at Xamarin.Android.Tasks.AndroidComputeResPaths.Execute () [0x00000] in <filename unknown>:0
at Microsoft.Build.BuildEngine.TaskEngine.Execute () [0x00000] in <filename unknown>:0
at Microsoft.Build.BuildEngine.BuildTask.Execute () [0x00000] in <filename unknown>:0
Wat? Well, in tr-TR, "Identity".ToLower() is "ıdentity", which
doesn't match match anything in GetReservedMetadata()'s `switch`
statement, so it throws an ArgumentException. *BOOM*.
So, if you need a culture-invariant comparison, USE IT.
Related: We could have just s/ToLower/ToLowerInvariant/g, which would
have fixed the problem, but would still result in lots of string
temporaries that aren't really necessary. Use the appropriate
string.Compare() or string.Equals() methods instead to avoid the
string temporary as well.
Diffstat (limited to 'mcs/class/Microsoft.Build.Engine')
3 files changed, 8 insertions, 4 deletions
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs index feac4e68333..3421813ce8d 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs @@ -125,7 +125,9 @@ namespace Microsoft.Build.BuildEngine { { if (ReservedNameUtils.IsReservedMetadataName (metadataName)) { string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, evaluatedMetadata); - return (metadataName.ToLower () == "fullpath") ? MSBuildUtils.Escape (metadata) : metadata; + return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase) + ? MSBuildUtils.Escape (metadata) + : metadata; } if (evaluatedMetadata.Contains (metadataName)) @@ -138,7 +140,9 @@ namespace Microsoft.Build.BuildEngine { { if (ReservedNameUtils.IsReservedMetadataName (metadataName)) { string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, unevaluatedMetadata); - return (metadataName.ToLower () == "fullpath") ? MSBuildUtils.Escape (metadata) : metadata; + return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase) + ? MSBuildUtils.Escape (metadata) + : metadata; } else if (unevaluatedMetadata.Contains (metadataName)) return (string) unevaluatedMetadata [metadataName]; else diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs index 1b6b4003c04..2a62f4b388c 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs @@ -149,7 +149,7 @@ namespace Microsoft.Build.BuildEngine { bool TryParseConsoleColor (string color_str, ref ConsoleColor color) { - switch (color_str.ToLower ()) { + switch (color_str.ToLowerInvariant ()) { case "black": color = ConsoleColor.Black; break; case "blue": color = ConsoleColor.DarkBlue; break; diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs index e223bbc05cd..5c66cf72308 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs @@ -390,7 +390,7 @@ namespace Microsoft.Build.BuildEngine { internal string GetKeyForTarget (string target_name, bool include_global_properties) { // target name is case insensitive - return fullFileName + ":" + target_name.ToLower () + + return fullFileName + ":" + target_name.ToLowerInvariant () + (include_global_properties ? (":" + GlobalPropertiesToString (GlobalProperties)) : String.Empty); } |