Skip to content

Commit 6140ca7

Browse files
[X] Protect some xmlns
protect maui and x: xmlns from overloading. - fixes #28836
1 parent acd2a94 commit 6140ca7

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

Microsoft.Maui-vscode.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITest.Analyzers", "src\Tes
212212
EndProject
213213
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maui.Controls.Sample.Embedding", "src\Controls\samples\Controls.Sample.Embedding\Maui.Controls.Sample.Embedding.csproj", "{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}"
214214
EndProject
215+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGen.UnitTests", "src\Controls\tests\SourceGen.UnitTests\SourceGen.UnitTests.csproj", "{A426B2FC-F012-436B-BDD9-BEC0025DB96B}"
216+
EndProject
215217
Global
216218
GlobalSection(SolutionConfigurationPlatforms) = preSolution
217219
Debug|Any CPU = Debug|Any CPU
@@ -539,6 +541,10 @@ Global
539541
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
540542
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Build.0 = Release|Any CPU
541543
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Deploy.0 = Release|Any CPU
544+
{A426B2FC-F012-436B-BDD9-BEC0025DB96B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
545+
{A426B2FC-F012-436B-BDD9-BEC0025DB96B}.Debug|Any CPU.Build.0 = Debug|Any CPU
546+
{A426B2FC-F012-436B-BDD9-BEC0025DB96B}.Release|Any CPU.ActiveCfg = Release|Any CPU
547+
{A426B2FC-F012-436B-BDD9-BEC0025DB96B}.Release|Any CPU.Build.0 = Release|Any CPU
542548
EndGlobalSection
543549
GlobalSection(SolutionProperties) = preSolution
544550
HideSolutionNode = FALSE
@@ -636,6 +642,7 @@ Global
636642
{0048EA9A-D751-4576-A2BB-2A37BFB385A5} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
637643
{DA001142-4777-4EDE-97D5-B1AC08162F99} = {7AC28763-9C68-4BF9-A1BA-25CBFFD2D15C}
638644
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55}
645+
{A426B2FC-F012-436B-BDD9-BEC0025DB96B} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
639646
EndGlobalSection
640647
GlobalSection(ExtensibilityGlobals) = postSolution
641648
SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50}

src/Controls/src/Build.Tasks/XmlTypeExtensions.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
34
using System.Xml;
@@ -26,14 +27,24 @@ static IList<XmlnsDefinitionAttribute> GatherXmlnsDefinitionAttributes(ModuleDef
2627
if (ca.AttributeType.FullName == typeof(XmlnsDefinitionAttribute).FullName)
2728
{
2829
var attr = GetXmlnsDefinition(ca, asmDef);
30+
//maui, and x: xmlns are protected
31+
if (attr.XmlNamespace.StartsWith("http://schemas.microsoft.com/", StringComparison.OrdinalIgnoreCase) &&
32+
!attr.AssemblyName.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase) &&
33+
!attr.AssemblyName.StartsWith("System", StringComparison.OrdinalIgnoreCase) &&
34+
!attr.AssemblyName.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase))
35+
{
36+
throw new BuildException(BuildExceptionCode.InvalidXaml, null, null,
37+
$"Protected Xmlns {attr.XmlNamespace}. Can't add assembly {attr.AssemblyName}.");
38+
}
39+
2940
xmlnsDefinitions.Add(attr);
3041
}
3142
}
3243
}
3344
}
3445
else
3546
{
36-
// Use standard XF assemblies
47+
// Use standard MAUI assemblies
3748
// (Should only happen in unit tests)
3849
var requiredAssemblies = new[] {
3950
typeof(XamlLoader).Assembly,
@@ -42,7 +53,16 @@ static IList<XmlnsDefinitionAttribute> GatherXmlnsDefinitionAttributes(ModuleDef
4253
foreach (var assembly in requiredAssemblies)
4354
foreach (XmlnsDefinitionAttribute attribute in assembly.GetCustomAttributes(typeof(XmlnsDefinitionAttribute), false))
4455
{
45-
attribute.AssemblyName = attribute.AssemblyName ?? assembly.FullName;
56+
attribute.AssemblyName ??= assembly.FullName;
57+
//maui, and x: xmlns are protected
58+
if (attribute.XmlNamespace.StartsWith("http://schemas.microsoft.com/", StringComparison.OrdinalIgnoreCase) &&
59+
!attribute.AssemblyName.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase) &&
60+
!attribute.AssemblyName.StartsWith("System", StringComparison.OrdinalIgnoreCase) &&
61+
!attribute.AssemblyName.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase))
62+
{
63+
throw new BuildException(BuildExceptionCode.InvalidXaml, null, null,
64+
$"Protected Xmlns {attribute.XmlNamespace}. Can't add assembly {attribute.AssemblyName}."); }
65+
4666
xmlnsDefinitions.Add(attribute);
4767
}
4868
}

src/Controls/src/Xaml/XamlParser.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,16 +336,25 @@ static IValueNode GetValueNode(object value, XmlReader reader)
336336
static void GatherXmlnsDefinitionAttributes()
337337
{
338338
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
339-
s_xmlnsDefinitions = new List<XmlnsDefinitionAttribute>();
339+
s_xmlnsDefinitions = [];
340340

341341
foreach (var assembly in assemblies)
342342
{
343343
try
344344
{
345345
foreach (XmlnsDefinitionAttribute attribute in assembly.GetCustomAttributes(typeof(XmlnsDefinitionAttribute)))
346346
{
347+
attribute.AssemblyName ??= assembly.FullName;
348+
//maui, and x: xmlns are protected
349+
if (attribute.XmlNamespace.StartsWith("http://schemas.microsoft.com/", StringComparison.Ordinal) &&
350+
!attribute.AssemblyName.StartsWith("Microsoft", StringComparison.Ordinal) &&
351+
!attribute.AssemblyName.StartsWith("System", StringComparison.Ordinal) &&
352+
!attribute.AssemblyName.StartsWith("mscorlib", StringComparison.Ordinal))
353+
{
354+
Debug.WriteLine($"Can not overloadxmlns {attribute.XmlNamespace}. cause it's protected.");
355+
continue;
356+
}
347357
s_xmlnsDefinitions.Add(attribute);
348-
attribute.AssemblyName = attribute.AssemblyName ?? assembly.FullName;
349358
}
350359
}
351360
catch (Exception ex)

0 commit comments

Comments
 (0)