fix: Potential fixes for over-reading XML

This commit is contained in:
Chris Cameron
2018-09-09 21:24:39 -04:00
parent 12ee533cbb
commit a3e548290f

View File

@@ -101,18 +101,37 @@ namespace ICD.Common.Utils.Xml
[PublicAPI] [PublicAPI]
public virtual T ReadXmlTyped(IcdXmlReader reader) public virtual T ReadXmlTyped(IcdXmlReader reader)
{ {
// Read into the first node
if (!reader.Read())
throw new FormatException();
T output = default(T); T output = default(T);
bool instantiated = false; bool instantiated = false;
while (reader.Read()) while (reader.NodeType != XmlNodeType.EndElement)
{ {
if (reader.NodeType == XmlNodeType.Element && reader.IsEmptyElement)
break;
if (!instantiated) if (!instantiated)
{ {
instantiated = true; switch (reader.NodeType)
output = Instantiate(); {
case XmlNodeType.Element:
if (reader.IsEmptyElement)
return default(T);
output = Instantiate();
instantiated = true;
// Read out of the root element
if (!reader.Read())
throw new FormatException();
continue;
default:
// Keep reading until we reach the root element.
if (!reader.Read())
throw new FormatException();
continue;
}
} }
switch (reader.NodeType) switch (reader.NodeType)
@@ -124,6 +143,14 @@ namespace ICD.Common.Utils.Xml
case XmlNodeType.Element: case XmlNodeType.Element:
ReadElement(reader, output); ReadElement(reader, output);
break; break;
case XmlNodeType.EndElement:
return output;
default:
if (!reader.Read())
return output;
break;
} }
} }
@@ -149,7 +176,7 @@ namespace ICD.Common.Utils.Xml
protected virtual void ReadElement(IcdXmlReader reader, T instance) protected virtual void ReadElement(IcdXmlReader reader, T instance)
{ {
// Skip the element // Skip the element
reader.ReadOuterXml(); reader.Skip();
} }
} }
} }