Browse Source

Fix #168: ILSpy crashes on close when viewing an obfuscated assembly

pull/143/merge
Daniel Grunwald 14 years ago
parent
commit
a1205d40e9
  1. 21
      ILSpy/ILSpySettings.cs

21
ILSpy/ILSpySettings.cs

@ -19,6 +19,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
@ -58,7 +59,7 @@ namespace ICSharpCode.ILSpy
{ {
using (new MutexProtector(ConfigFileMutex)) { using (new MutexProtector(ConfigFileMutex)) {
try { try {
XDocument doc = XDocument.Load(GetConfigFile()); XDocument doc = LoadWithoutCheckingCharacters(GetConfigFile());
return new ILSpySettings(doc.Root); return new ILSpySettings(doc.Root);
} catch (IOException) { } catch (IOException) {
return new ILSpySettings(); return new ILSpySettings();
@ -68,6 +69,15 @@ namespace ICSharpCode.ILSpy
} }
} }
static XDocument LoadWithoutCheckingCharacters(string fileName)
{
// XDocument.Load(fileName) validates that no invalid characters appear (not even in escaped form),
// but we need those characters for some obfuscated assemblies.
using (XmlTextReader r = new XmlTextReader(fileName)) {
return XDocument.Load(r);
}
}
/// <summary> /// <summary>
/// Saves a setting section. /// Saves a setting section.
/// </summary> /// </summary>
@ -94,7 +104,7 @@ namespace ICSharpCode.ILSpy
string config = GetConfigFile(); string config = GetConfigFile();
XDocument doc; XDocument doc;
try { try {
doc = XDocument.Load(config); doc = LoadWithoutCheckingCharacters(config);
} catch (IOException) { } catch (IOException) {
// ensure the directory exists // ensure the directory exists
Directory.CreateDirectory(Path.GetDirectoryName(config)); Directory.CreateDirectory(Path.GetDirectoryName(config));
@ -104,7 +114,12 @@ namespace ICSharpCode.ILSpy
} }
doc.Root.SetAttributeValue("version", RevisionClass.Major + "." + RevisionClass.Minor + "." + RevisionClass.Build + "." + RevisionClass.Revision); doc.Root.SetAttributeValue("version", RevisionClass.Major + "." + RevisionClass.Minor + "." + RevisionClass.Build + "." + RevisionClass.Revision);
action(doc.Root); action(doc.Root);
doc.Save(config); // We can't use XDocument.Save(filename) because that checks for invalid characters, but those can appear
// in obfuscated assemblies.
using (XmlTextWriter writer = new XmlTextWriter(config, Encoding.UTF8)) {
writer.Formatting = Formatting.Indented;
doc.Save(writer);
}
} }
} }

Loading…
Cancel
Save