[tomboy] More defensive note XML parsing, to prevent crashes like in bug #581844.
- From: Sanford Armstrong <sharm src gnome org>
- To: svn-commits-list gnome org
- Subject: [tomboy] More defensive note XML parsing, to prevent crashes like in bug #581844.
- Date: Sun, 10 May 2009 12:38:21 -0400 (EDT)
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]