[tomboy] More defensive note XML parsing, to prevent crashes like in bug #581844.



commit 2160c2fa5613813e0f192c8744cea526e25f94b1
Author: Sandy Armstrong <sanfordarmstrong gmail com>
Date:   Sun May 10 09:36:59 2009 -0700

    More defensive note XML parsing, to prevent crashes like in bug #581844.
---
 Tomboy/Note.cs                             |   64 +++++++++++++++++++--------
 Tomboy/Synchronization/TomboySyncClient.cs |    2 +-
 2 files changed, 46 insertions(+), 20 deletions(-)

diff --git a/Tomboy/Note.cs b/Tomboy/Note.cs
index 8ae6caf..117d9cb 100644
--- a/Tomboy/Note.cs
+++ b/Tomboy/Note.cs
@@ -809,6 +809,7 @@ namespace Tomboy
 			// Remove tags now, since a note with no tags has
 			// no "tags" element in the XML
 			List<Tag> newTags = new List<Tag> ();
+			DateTime date;
 
 			while (xml.Read ()) {
 				switch (xml.NodeType) {
@@ -821,16 +822,22 @@ namespace Tomboy
 						XmlContent = xml.ReadInnerXml ();
 						break;
 					case "last-change-date":
-						data.Data.ChangeDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), NoteArchiver.DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							data.Data.ChangeDate = date;
+						else
+							data.Data.ChangeDate = DateTime.Now;
 						break;
 					case "last-metadata-change-date":
-						data.Data.MetadataChangeDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), NoteArchiver.DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							data.Data.MetadataChangeDate = date;
+						else
+							data.Data.MetadataChangeDate = DateTime.Now;
 						break;
 					case "create-date":
-						data.Data.CreateDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), NoteArchiver.DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							data.Data.CreateDate = date;
+						else
+							data.Data.CreateDate = DateTime.Now;
 						break;
 					case "tags":
 						XmlDocument doc = new XmlDocument ();
@@ -841,7 +848,9 @@ namespace Tomboy
 						}
 						break;
 					case "open-on-startup":
-						IsOpenOnStartup = bool.Parse (xml.ReadString ());
+						bool isStartup;
+						if (bool.TryParse (xml.ReadString (), out isStartup))
+							IsOpenOnStartup = isStartup;
 						break;
 					}
 					break;
@@ -1108,6 +1117,8 @@ namespace Tomboy
 	{
 		public const string CURRENT_VERSION = "0.3";
 
+		// NOTE: If this changes from a standard format, make sure to update
+		//       XML parsing to have a DateTime.TryParseExact
 		public const string DATE_TIME_FORMAT = "yyyy-MM-ddTHH:mm:ss.fffffffzzz";
 
 		static NoteArchiver instance = null;
@@ -1150,6 +1161,8 @@ namespace Tomboy
 			                                        System.Text.Encoding.UTF8);
 			XmlTextReader xml = new XmlTextReader (reader);
 			xml.Namespaces = false;
+			DateTime date;
+			int num;
 
 			while (xml.Read ()) {
 				switch (xml.NodeType) {
@@ -1167,31 +1180,42 @@ namespace Tomboy
 						note.Text = xml.ReadInnerXml ();
 						break;
 					case "last-change-date":
-						note.ChangeDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							note.ChangeDate = date;
+						else
+							note.ChangeDate = DateTime.Now;
 						break;
 					case "last-metadata-change-date":
-						note.MetadataChangeDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							note.MetadataChangeDate = date;
+						else
+							note.MetadataChangeDate = DateTime.Now;
 						break;
 					case "create-date":
-						note.CreateDate =
-						        XmlConvert.ToDateTime (xml.ReadString (), DATE_TIME_FORMAT);
+						if (DateTime.TryParse (xml.ReadString (), out date))
+							note.CreateDate = date;
+						else
+							note.CreateDate = DateTime.Now;
 						break;
 					case "cursor-position":
-						note.CursorPosition = int.Parse (xml.ReadString ());
+						if (int.TryParse (xml.ReadString (), out num))
+							note.CursorPosition = num;
 						break;
 					case "width":
-						note.Width = int.Parse (xml.ReadString ());
+						if (int.TryParse (xml.ReadString (), out num))
+							note.Width = num;
 						break;
 					case "height":
-						note.Height = int.Parse (xml.ReadString ());
+						if (int.TryParse (xml.ReadString (), out num))
+							note.Height = num;
 						break;
 					case "x":
-						note.X = int.Parse (xml.ReadString ());
+						if (int.TryParse (xml.ReadString (), out num))
+							note.X = num;
 						break;
 					case "y":
-						note.Y = int.Parse (xml.ReadString ());
+						if (int.TryParse (xml.ReadString (), out num))
+							note.Y = num;
 						break;
 					case "tags":
 						XmlDocument doc = new XmlDocument ();
@@ -1202,7 +1226,9 @@ namespace Tomboy
 						}
 						break;
 					case "open-on-startup":
-						note.IsOpenOnStartup = bool.Parse (xml.ReadString ());
+						bool isStartup;
+						if (bool.TryParse (xml.ReadString (), out isStartup))
+							note.IsOpenOnStartup = isStartup;
 						break;
 					}
 					break;
diff --git a/Tomboy/Synchronization/TomboySyncClient.cs b/Tomboy/Synchronization/TomboySyncClient.cs
index f880c39..d85b46b 100644
--- a/Tomboy/Synchronization/TomboySyncClient.cs
+++ b/Tomboy/Synchronization/TomboySyncClient.cs
@@ -125,7 +125,7 @@ namespace Tomboy.Sync
 
 				foreach (XmlNode node in doc.GetElementsByTagName ("last-sync-date")) {
 					try {
-						lastSyncDate = XmlConvert.ToDateTime (node.InnerText);
+						lastSyncDate = DateTime.Parse (node.InnerText);
 					} catch {
 					Logger.Error ("Unparsable last-sync-date element in " + manifestPath);
 					}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]