[DatFile] Make XML parsing safer; skip malformed XML lines

This commit is contained in:
Matt Nadareski
2016-09-28 12:27:39 -07:00
parent 735e76ccda
commit 36f9b12d06
5 changed files with 824 additions and 811 deletions

View File

@@ -33,7 +33,7 @@ namespace SabreTools
Dictionary<string, Tuple<long, bool>> depots = new Dictionary<string, Tuple<long, bool>>(); Dictionary<string, Tuple<long, bool>> depots = new Dictionary<string, Tuple<long, bool>>();
// Get the XML text reader for the configuration file, if possible // Get the XML text reader for the configuration file, if possible
XmlTextReader xtr = FileTools.GetXmlTextReader(_config, _logger); XmlReader xtr = FileTools.GetXmlTextReader(_config, _logger);
// Now parse the XML file for settings // Now parse the XML file for settings
if (xtr != null) if (xtr != null)

View File

@@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
namespace SabreTools.Helper namespace SabreTools.Helper
{ {

View File

@@ -2228,7 +2228,8 @@ namespace SabreTools.Helper
ItemStatus its = ItemStatus.None; ItemStatus its = ItemStatus.None;
List<string> parent = new List<string>(); List<string> parent = new List<string>();
XmlTextReader xtr = FileTools.GetXmlTextReader(filename, logger); Encoding enc = Style.GetEncoding(filename);
XmlReader xtr = FileTools.GetXmlTextReader(filename, logger);
// If we got a null reader, just return // If we got a null reader, just return
if (xtr == null) if (xtr == null)
@@ -2237,6 +2238,8 @@ namespace SabreTools.Helper
} }
// Otherwise, read the file to the end // Otherwise, read the file to the end
try
{
xtr.MoveToContent(); xtr.MoveToContent();
while (!xtr.EOF) while (!xtr.EOF)
{ {
@@ -3068,6 +3071,12 @@ namespace SabreTools.Helper
break; break;
} }
} }
}
catch
{
// For XML errors, just skip the affected node
xtr?.Skip();
}
xtr.Dispose(); xtr.Dispose();
} }

View File

@@ -64,7 +64,7 @@ namespace SabreTools.Helper
} }
Logger logger = new Logger(false, ""); Logger logger = new Logger(false, "");
XmlTextReader xtr = FileTools.GetXmlTextReader(filename, logger); XmlReader xtr = FileTools.GetXmlTextReader(filename, logger);
if (xtr == null) if (xtr == null)
{ {

View File

@@ -6,6 +6,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Xml; using System.Xml;
using System.Xml.Schema;
namespace SabreTools.Helper namespace SabreTools.Helper
{ {
@@ -176,7 +177,7 @@ namespace SabreTools.Helper
/// <param name="filename">Name of the file to be parsed</param> /// <param name="filename">Name of the file to be parsed</param>
/// <param name="logger">Logger object for console and file output</param> /// <param name="logger">Logger object for console and file output</param>
/// <returns>The XmlTextReader representing the (possibly converted) file, null otherwise</returns> /// <returns>The XmlTextReader representing the (possibly converted) file, null otherwise</returns>
public static XmlTextReader GetXmlTextReader(string filename, Logger logger) public static XmlReader GetXmlTextReader(string filename, Logger logger)
{ {
logger.Verbose("Attempting to read file: \"" + filename + "\""); logger.Verbose("Attempting to read file: \"" + filename + "\"");
@@ -187,10 +188,14 @@ namespace SabreTools.Helper
return null; return null;
} }
XmlTextReader xtr; XmlReader xtr = XmlReader.Create(filename, new XmlReaderSettings {
xtr = new XmlTextReader(filename); CheckCharacters = false,
xtr.WhitespaceHandling = WhitespaceHandling.None; DtdProcessing = DtdProcessing.Ignore,
xtr.DtdProcessing = DtdProcessing.Ignore; IgnoreComments = true,
IgnoreWhitespace = true,
ValidationFlags = XmlSchemaValidationFlags.None,
ValidationType = ValidationType.None,
});
return xtr; return xtr;
} }