From be502339f238870a3475c16f8b1b0389d76d29b4 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Wed, 10 Jan 2024 15:37:23 +0100 Subject: [PATCH 1/6] fix parsing GB18030 --- .../GenerateBindingRedirects_Tests.cs | 25 ++++++++++++++++--- .../GenerateBindingRedirects.cs | 8 +++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs b/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs index a417cabd783..3b8631c10bb 100644 --- a/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs +++ b/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs @@ -259,6 +259,22 @@ public void AppConfigInvalidIfDependentAssemblyNodeIsEmpty() redirectResults.Engine.AssertLogContains("MSB3835"); } + [Fact] + public void AppConfigWhenFilePlacedInLocationWithGB18030Characters() + { + using (TestEnvironment env = TestEnvironment.Create()) + { + TransientTestFolder rootTestFolder = _env.CreateFolder(); + TransientTestFolder testFolder = _env.CreateFolder(Path.Combine(rootTestFolder.Path, "𬴂龨苘爫麤υ㏑䡫3")); + string appConfigContents = WriteAppConfigRuntimeSection(string.Empty, testFolder); + string outputAppConfigFile = _env.ExpectFile(".config").Path; + + TaskItemMock redirect = new TaskItemMock("System, Version=10.0.0.0, Culture=Neutral, PublicKeyToken='b77a5c561934e089'", "40.0.0.0"); + + _ = Should.NotThrow(() => GenerateBindingRedirects(appConfigContents, outputAppConfigFile, redirect)); + } + } + [Fact] public void AppConfigFileNotSavedWhenIdentical() { @@ -306,12 +322,11 @@ private BindingRedirectsExecutionResult GenerateBindingRedirects(string appConfi GenerateBindingRedirects bindingRedirects = new GenerateBindingRedirects { BuildEngine = engine, - SuggestedRedirects = suggestedRedirects ?? System.Array.Empty(), + SuggestedRedirects = suggestedRedirects ?? Array.Empty(), AppConfigFile = new TaskItem(appConfigFile), OutputAppConfigFile = new TaskItem(outputAppConfig) }; - bool executionResult = bindingRedirects.Execute(); return new BindingRedirectsExecutionResult @@ -324,7 +339,9 @@ private BindingRedirectsExecutionResult GenerateBindingRedirects(string appConfi }; } - private string WriteAppConfigRuntimeSection(string runtimeSection) + private string WriteAppConfigRuntimeSection( + string runtimeSection, + TransientTestFolder transientTestFolder = null) { string formatString = @" @@ -334,7 +351,7 @@ private string WriteAppConfigRuntimeSection(string runtimeSection) "; string appConfigContents = string.Format(formatString, runtimeSection); - string appConfigFile = _env.CreateFile(".config").Path; + string appConfigFile = _env.CreateFile(transientTestFolder ?? new TransientTestFolder(), ".config").Path; File.WriteAllText(appConfigFile, appConfigContents); return appConfigFile; } diff --git a/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs b/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs index c108bb142f0..8b8f25ee0a9 100644 --- a/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs +++ b/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs @@ -10,6 +10,7 @@ using Microsoft.Build.Shared; using Microsoft.Build.Shared.FileSystem; using System.IO; +using System.Xml; #nullable disable @@ -335,7 +336,12 @@ private XDocument LoadAppConfig(ITaskItem appConfigItem) } else { - document = XDocument.Load(appConfigItem.ItemSpec); + var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true }; + using (XmlReader xr = XmlReader.Create(File.OpenRead(appConfigItem.ItemSpec), xrs)) + { + document = XDocument.Load(xr); + } + if (document.Root == null || document.Root.Name != "configuration") { Log.LogErrorWithCodeFromResources("GenerateBindingRedirects.MissingConfigurationNode"); From 9e4aaa9ba66fe533c550468dd7cd64a305229bce Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Thu, 11 Jan 2024 08:46:22 +0100 Subject: [PATCH 2/6] add XDocument.Load(System.String) to banned API --- src/BannedSymbols.txt | 2 ++ src/Shared/UnitTests/TestAssemblyInfo.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/BannedSymbols.txt b/src/BannedSymbols.txt index c369fe9d42b..1713f85376d 100644 --- a/src/BannedSymbols.txt +++ b/src/BannedSymbols.txt @@ -5,3 +5,5 @@ M:System.Xml.XmlReader.Create(System.String,System.Xml.XmlReaderSettings);Do not M:System.Xml.XmlReader.Create(System.String,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext);Do not pass paths to XmlReader.Create--use the Stream overload M:System.Xml.XPath.XPathDocument.#ctor(System.String);Do not pass string paths to XPathDocument ctor--use the Stream overload M:System.Xml.XPath.XPathDocument.#ctor(System.String,System.Xml.XmlSpace);Do not pass string paths to XPathDocument ctor--use the Stream overload +M:System.Xml.Linq.XDocument.Load(System.String);Do not pass uri to XDocument.Load, use overload with XmlReader instead +M:System.Xml.Linq.XDocument.Load(System.String, System.Xml.Linq.LoadOptions);Do not pass uri to XDocument.Load, use overload with XmlReader instead diff --git a/src/Shared/UnitTests/TestAssemblyInfo.cs b/src/Shared/UnitTests/TestAssemblyInfo.cs index 368eb99d6c6..a78d3e0485f 100644 --- a/src/Shared/UnitTests/TestAssemblyInfo.cs +++ b/src/Shared/UnitTests/TestAssemblyInfo.cs @@ -4,7 +4,9 @@ using System; using System.IO; using System.Linq; +using System.Reflection.Metadata; using System.Runtime.InteropServices; +using System.Xml; using System.Xml.Linq; using Microsoft.Build.Shared; using Microsoft.Build.Shared.FileSystem; @@ -103,7 +105,13 @@ private static void SetDotnetHostPath(TestEnvironment testEnvironment) string potentialVersionsPropsPath = Path.Combine(currentFolder, "build", "Versions.props"); if (FileSystems.Default.FileExists(potentialVersionsPropsPath)) { - var doc = XDocument.Load(potentialVersionsPropsPath); + XDocument doc = null; + var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true }; + using (XmlReader xr = XmlReader.Create(File.OpenRead(potentialVersionsPropsPath), xrs)) + { + doc = XDocument.Load(xr); + } + var ns = doc.Root.Name.Namespace; var cliVersionElement = doc.Root.Elements(ns + "PropertyGroup").Elements(ns + "DotNetCliVersion").FirstOrDefault(); if (cliVersionElement != null) From b32c570c4fb265d1107325c7632f71bd27a02264 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Thu, 11 Jan 2024 08:51:12 +0100 Subject: [PATCH 3/6] address comments in test --- src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs b/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs index 3b8631c10bb..07b1ce57a0f 100644 --- a/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs +++ b/src/Tasks.UnitTests/GenerateBindingRedirects_Tests.cs @@ -264,10 +264,10 @@ public void AppConfigWhenFilePlacedInLocationWithGB18030Characters() { using (TestEnvironment env = TestEnvironment.Create()) { - TransientTestFolder rootTestFolder = _env.CreateFolder(); - TransientTestFolder testFolder = _env.CreateFolder(Path.Combine(rootTestFolder.Path, "𬴂龨苘爫麤υ㏑䡫3")); + TransientTestFolder rootTestFolder = env.CreateFolder(); + TransientTestFolder testFolder = env.CreateFolder(Path.Combine(rootTestFolder.Path, "\uD873\uDD02\u9FA8\u82D8\u722B\u9EA4\u03C5\u33D1\uE038\u486B\u0033")); string appConfigContents = WriteAppConfigRuntimeSection(string.Empty, testFolder); - string outputAppConfigFile = _env.ExpectFile(".config").Path; + string outputAppConfigFile = env.ExpectFile(".config").Path; TaskItemMock redirect = new TaskItemMock("System, Version=10.0.0.0, Culture=Neutral, PublicKeyToken='b77a5c561934e089'", "40.0.0.0"); From b8d208657dcb42a78a6f91296c44abb1c7a11b25 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Thu, 11 Jan 2024 09:05:22 +0100 Subject: [PATCH 4/6] remore extra using --- src/Shared/UnitTests/TestAssemblyInfo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Shared/UnitTests/TestAssemblyInfo.cs b/src/Shared/UnitTests/TestAssemblyInfo.cs index a78d3e0485f..9515a2e5efd 100644 --- a/src/Shared/UnitTests/TestAssemblyInfo.cs +++ b/src/Shared/UnitTests/TestAssemblyInfo.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Linq; -using System.Reflection.Metadata; using System.Runtime.InteropServices; using System.Xml; using System.Xml.Linq; From 112a61ef0124553afff6fdd8191fd388a98e4fef Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Thu, 11 Jan 2024 09:53:25 +0100 Subject: [PATCH 5/6] fix test failure --- src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs b/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs index 8b8f25ee0a9..99307761f8f 100644 --- a/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs +++ b/src/Tasks/AssemblyDependency/GenerateBindingRedirects.cs @@ -336,7 +336,7 @@ private XDocument LoadAppConfig(ITaskItem appConfigItem) } else { - var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true }; + var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true, IgnoreWhitespace = true }; using (XmlReader xr = XmlReader.Create(File.OpenRead(appConfigItem.ItemSpec), xrs)) { document = XDocument.Load(xr); From 777db2e870a8e4eb2599cb85fc471ecf54c7aa18 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova Date: Thu, 11 Jan 2024 15:46:52 +0100 Subject: [PATCH 6/6] add IgnoreWhitespace to TestAssemblyInfo --- src/Shared/UnitTests/TestAssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Shared/UnitTests/TestAssemblyInfo.cs b/src/Shared/UnitTests/TestAssemblyInfo.cs index 9515a2e5efd..08353749def 100644 --- a/src/Shared/UnitTests/TestAssemblyInfo.cs +++ b/src/Shared/UnitTests/TestAssemblyInfo.cs @@ -105,7 +105,7 @@ private static void SetDotnetHostPath(TestEnvironment testEnvironment) if (FileSystems.Default.FileExists(potentialVersionsPropsPath)) { XDocument doc = null; - var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true }; + var xrs = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, CloseInput = true, IgnoreWhitespace = true }; using (XmlReader xr = XmlReader.Create(File.OpenRead(potentialVersionsPropsPath), xrs)) { doc = XDocument.Load(xr);