[tomboy/gnome-2-26] 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/gnome-2-26] More defensive note XML parsing, to prevent crashes like in bug #581844.
- Date: Mon, 11 May 2009 10:16:03 -0400 (EDT)
commit e60ca1f77775035549f76906585f627a8fc29c38
Author: Sandy Armstrong <sanfordarmstrong gmail com>
Date: Sun May 10 08:36:59 2009 -0800
More defensive note XML parsing, to prevent crashes like in bug #581844.
---
Tomboy/Note.cs | 65 +++++++++++++++++++--------
Tomboy/Synchronization/TomboySyncClient.cs | 2 +-
2 files changed, 47 insertions(+), 20 deletions(-)
diff --git a/Tomboy/Note.cs b/Tomboy/Note.cs
index 0ab1586..d76fa55 100644
--- a/Tomboy/Note.cs
+++ b/Tomboy/Note.cs
@@ -811,6 +811,8 @@ namespace Tomboy
foreach (Tag tag in Tags)
RemoveTag (tag);
+ DateTime date;
+
while (xml.Read ()) {
switch (xml.NodeType) {
case XmlNodeType.Element:
@@ -822,16 +824,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 ();
@@ -842,7 +850,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;
@@ -1103,6 +1113,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;
@@ -1145,6 +1157,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) {
@@ -1162,31 +1176,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 ();
@@ -1197,7 +1222,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]