From c4775a55b80f64f3144c2495e27668785e000906 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Wed, 14 May 2014 16:04:05 -0400 Subject: [PATCH] [mdoc] Fix NullReferenceException when importing @name attribute. (Reported by directhex on #mono 2014-05-14 at 14:28 EDT.) When importing Microsoft XML Documentation, if a //altmember/@name, //exception/@name, or //permission/@name attribute is encountered then mdoc will die with a NullReferenceException: mdoc: System.NullReferenceException: Object reference not set to an instance of an object at Mono.Documentation.MsxdocDocumentationImporter.ImportDocumentation (Mono.Documentation.DocsNodeInfo info) at Mono.Documentation.MDocUpdater.MakeDocNode (Mono.Documentation.DocsNodeInfo info) at Mono.Documentation.MDocUpdater.UpdateMember (Mono.Documentation.DocsNodeInfo info) at Mono.Documentation.MDocUpdater.MakeMember (System.Xml.XmlDocument doc, Mono.Documentation.DocsNodeInfo info) at Mono.Documentation.MDocUpdater.DoUpdateType2 (System.String message, System.Xml.XmlDocument basefile, Mono.Cecil.TypeDefinition type, System.String output, Boolean insertSince) at Mono.Documentation.MDocUpdater.StubType (Mono.Cecil.TypeDefinition type, System.String output) at Mono.Documentation.MDocUpdater.DoUpdateType (Mono.Cecil.TypeDefinition type, System.String basepath, System.String dest) at Mono.Documentation.MDocUpdater.DoUpdateAssembly (Mono.Cecil.AssemblyDefinition assembly, System.Xml.XmlElement index_types, System.String source, System.String dest, System.Collections.Generic.HashSet`1 goodfiles) at Mono.Documentation.MDocUpdater.DoUpdateAssemblies (System.String source, System.String dest) at Mono.Documentation.MDocUpdater.Run (IEnumerable`1 args) at Mono.Documentation.MDoc.Run (System.String[] args) at Mono.Documentation.MDoc.Main (System.String[] args) The cause of the NullReferenceException is due to inconsistent checking: we check that _either_ `child.Attributes["cref"]` OR `child.Attributes["name"]` is not null, and if one of them IS non-null then we just grab `child.Attributes["cref"].Value`, which will throw a NullReferenceException if the @name attribute was present but not the @cref attribute. The fix is to be consistent: once we grab an XmlAttribute, use the already looked up XmlAttribute, don't re-look it up. --- mcs/tools/mdoc/Mono.Documentation/monodocer.cs | 4 ++-- mcs/tools/mdoc/Test/DocTest-v1.cs | 1 + .../en.expected.importslashdoc/Mono.DocTest/UseLists.xml | 1 + .../mdoc/Test/html.expected/Mono.DocTest/UseLists.html | 6 ++++++ mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs index a6e3b6e517b..853f7a709b2 100644 --- a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs +++ b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs @@ -3082,7 +3082,7 @@ class MsxdocDocumentationImporter : DocumentationImporter { XmlElement a = (XmlElement) e.SelectSingleNode (child.Name + "[@cref='" + cref.Value + "']"); if (a == null) { a = e.OwnerDocument.CreateElement (child.Name); - a.SetAttribute ("cref", child.Attributes ["cref"].Value); + a.SetAttribute ("cref", cref.Value); e.AppendChild (a); } a.InnerXml = child.InnerXml; @@ -3095,7 +3095,7 @@ class MsxdocDocumentationImporter : DocumentationImporter { XmlElement a = (XmlElement) e.SelectSingleNode ("altmember[@cref='" + cref.Value + "']"); if (a == null) { a = e.OwnerDocument.CreateElement ("altmember"); - a.SetAttribute ("cref", child.Attributes ["cref"].Value); + a.SetAttribute ("cref", cref.Value); e.AppendChild (a); } break; diff --git a/mcs/tools/mdoc/Test/DocTest-v1.cs b/mcs/tools/mdoc/Test/DocTest-v1.cs index 52bc1961113..4e064b427b6 100644 --- a/mcs/tools/mdoc/Test/DocTest-v1.cs +++ b/mcs/tools/mdoc/Test/DocTest-v1.cs @@ -438,6 +438,7 @@ namespace Mono.DocTest { /// M:Mono.DocTest.UseLists.Process(System.Collections.Generic.List{System.Int32}). /// /// + /// text! /// text! public void Process (List list) { diff --git a/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/UseLists.xml b/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/UseLists.xml index d949b562def..34b1266dabd 100644 --- a/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/UseLists.xml +++ b/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/UseLists.xml @@ -104,6 +104,7 @@ To be added; from: + text! diff --git a/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/UseLists.html b/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/UseLists.html index eac70b5dca2..0f12f07ea89 100644 --- a/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/UseLists.html +++ b/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/UseLists.html @@ -442,6 +442,12 @@ Documentation for this section has not yet been entered. + + + Whatever + + text! +

Remarks

diff --git a/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml b/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml index 813f3def6ce..3070ad24cf2 100644 --- a/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml +++ b/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml @@ -162,6 +162,7 @@ class Example { To be added; from: + text!
A . -- 2.25.1