aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Persch <chpe@svn.gnome.org>2007-01-29 04:06:12 +0800
committerChristian Persch <chpe@src.gnome.org>2007-01-29 04:06:12 +0800
commit819a719f62d6d9583d55b1c5ac787c7f64a03de6 (patch)
treebb8e94165702c9e8c1d5453a42a8d28ec5a5abf1
parent2eee055dd76bfe30aea7758025cdd499aea95b4d (diff)
downloadgsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar.gz
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar.bz2
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar.lz
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar.xz
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.tar.zst
gsoc2013-epiphany-819a719f62d6d9583d55b1c5ac787c7f64a03de6.zip
Make sure we don't write characters < 0x20 (except 0x9, 0xa, 0xd) to XML.
2007-01-28 Christian Persch <chpe@svn.gnome.org> * lib/ephy-node.c: (safe_write_string), (ephy_node_write_to_xml): * src/bookmarks/ephy-bookmarks-export.c: (sanitise_string), (write_topics_list), (write_rdf): Make sure we don't write characters < 0x20 (except 0x9, 0xa, 0xd) to XML. Bug #392782. svn path=/trunk/; revision=6856
-rw-r--r--ChangeLog9
-rw-r--r--lib/ephy-node.c34
-rw-r--r--src/bookmarks/ephy-bookmarks-export.c92
3 files changed, 114 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 801063b2a..28bfdc47f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2007-01-28 Christian Persch <chpe@svn.gnome.org>
+ * lib/ephy-node.c: (safe_write_string), (ephy_node_write_to_xml):
+ * src/bookmarks/ephy-bookmarks-export.c: (sanitise_string),
+ (write_topics_list), (write_rdf):
+
+ Make sure we don't write characters < 0x20 (except 0x9, 0xa, 0xd) to
+ XML. Bug #392782.
+
+2007-01-28 Christian Persch <chpe@svn.gnome.org>
+
* src/epiphany.defs:
* src/epiphany.override:
diff --git a/lib/ephy-node.c b/lib/ephy-node.c
index 5581d3322..7078f23b1 100644
--- a/lib/ephy-node.c
+++ b/lib/ephy-node.c
@@ -806,6 +806,38 @@ write_parent (guint id,
if (data->ret < 0) return;
}
+static inline int
+safe_write_string (xmlTextWriterPtr writer,
+ const xmlChar *string)
+{
+ int ret;
+ xmlChar *copy, *p;
+
+ if (!string)
+ return 0;
+
+ /* http://www.w3.org/TR/REC-xml/#sec-well-formed :
+ Character Range
+ [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] |
+ [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
+ */
+
+ copy = xmlStrdup (string);
+ for (p = copy; *p; p++)
+ {
+ xmlChar c = *p;
+ if (G_UNLIKELY (c < 0x20 && c != 0xd && c != 0xa && c != 0x9)) {
+ *p = 0x20;
+ }
+ }
+
+ ret = xmlTextWriterWriteString (writer, copy);
+ xmlFree (copy);
+
+ return ret;
+}
+
int
ephy_node_write_to_xml(EphyNode *node,
xmlTextWriterPtr writer)
@@ -851,7 +883,7 @@ ephy_node_write_to_xml(EphyNode *node,
switch (G_VALUE_TYPE (value))
{
case G_TYPE_STRING:
- ret = xmlTextWriterWriteString
+ ret = safe_write_string
(writer, (const xmlChar *)g_value_get_string (value));
break;
case G_TYPE_BOOLEAN:
diff --git a/src/bookmarks/ephy-bookmarks-export.c b/src/bookmarks/ephy-bookmarks-export.c
index eb882124a..9a88f8e70 100644
--- a/src/bookmarks/ephy-bookmarks-export.c
+++ b/src/bookmarks/ephy-bookmarks-export.c
@@ -35,6 +35,33 @@
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-utils.h>
+static inline xmlChar *
+sanitise_string (const xmlChar *string)
+{
+ xmlChar *copy, *p;
+
+ if (!string)
+ return xmlStrdup ((const xmlChar *) "");
+
+ /* http://www.w3.org/TR/REC-xml/#sec-well-formed :
+ Character Range
+ [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] |
+ [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
+ */
+
+ copy = xmlStrdup (string);
+ for (p = copy; *p; p++)
+ {
+ xmlChar c = *p;
+ if (G_UNLIKELY (c < 0x20 && c != 0xd && c != 0xa && c != 0x9)) {
+ *p = 0x20;
+ }
+ }
+
+ return copy;
+}
+
static int
write_topics_list (EphyNode *topics,
EphyNode *bmk,
@@ -67,16 +94,20 @@ write_topics_list (EphyNode *topics,
{
EphyNode *node = l->data;
const char *name;
+ xmlChar *safeName;
name = ephy_node_get_property_string
(node, EPHY_NODE_KEYWORD_PROP_NAME);
+ safeName = sanitise_string ((const xmlChar *) name);
ret = xmlTextWriterWriteElementNS
(writer,
(xmlChar *) "dc",
(xmlChar *) "subject",
NULL,
- (xmlChar *) name);
+ safeName);
+ xmlFree (safeName);
+
if (ret < 0) break;
}
@@ -94,6 +125,7 @@ write_rdf (EphyBookmarks *bookmarks,
GPtrArray *children;
char *file_uri;
int i, ret;
+ xmlChar *safeString;
#ifdef ENABLE_ZEROCONF
EphyNode *local;
#endif
@@ -135,15 +167,18 @@ write_rdf (EphyBookmarks *bookmarks,
ret = xmlTextWriterStartElement (writer, (xmlChar *) "channel");
if (ret < 0) goto out;
- /* FIXME is this UTF-8 ? */
+ /* FIXME: sanitise file_uri? */
file_uri = gnome_vfs_get_uri_from_local_path (filename);
+ safeString = sanitise_string ((const xmlChar *) file_uri);
+ g_free (file_uri);
+
ret = xmlTextWriterWriteAttributeNS
(writer,
(xmlChar *) "rdf",
(xmlChar *) "about",
NULL,
- (xmlChar *) file_uri);
- g_free (file_uri);
+ safeString);
+ xmlFree (safeString);
if (ret < 0) goto out;
ret = xmlTextWriterWriteElement
@@ -182,6 +217,7 @@ write_rdf (EphyBookmarks *bookmarks,
const char *url;
char *link = NULL;
gboolean smart_url;
+ xmlChar *safeLink;
kid = g_ptr_array_index (children, i);
@@ -190,13 +226,6 @@ write_rdf (EphyBookmarks *bookmarks,
if (ephy_node_has_child (local, kid)) continue;
#endif
- ret = xmlTextWriterStartElementNS
- (writer,
- (xmlChar *) "rdf",
- (xmlChar *) "li",
- NULL);
- if (ret < 0) break;
-
smart_url = ephy_node_has_child (smart_bmks, kid);
url = ephy_node_get_property_string
(kid, EPHY_NODE_BMK_PROP_LOCATION);
@@ -217,13 +246,23 @@ write_rdf (EphyBookmarks *bookmarks,
}
}
+ safeLink = sanitise_string (link ? (const xmlChar *) link : (const xmlChar *) url);
+ g_free (link);
+
+ ret = xmlTextWriterStartElementNS
+ (writer,
+ (xmlChar *) "rdf",
+ (xmlChar *) "li",
+ NULL);
+ if (ret < 0) break;
+
ret = xmlTextWriterWriteAttributeNS
(writer,
(xmlChar *) "rdf",
(xmlChar *) "resource",
NULL,
- (xmlChar *) (link ? link : url));
- g_free (link);
+ safeLink);
+ xmlFree (safeLink);
if (ret < 0) break;
ret = xmlTextWriterEndElement (writer); /* rdf:li */
@@ -247,6 +286,7 @@ write_rdf (EphyBookmarks *bookmarks,
const char *url, *title;
char *link = NULL;
gboolean smart_url;
+ xmlChar *safeLink, *safeTitle;
kid = g_ptr_array_index (children, i);
@@ -286,34 +326,48 @@ write_rdf (EphyBookmarks *bookmarks,
ret = xmlTextWriterStartElement (writer, (xmlChar *) "item");
if (ret < 0) break;
+ safeLink = sanitise_string ((const xmlChar *) link);
+ g_free (link);
+
ret = xmlTextWriterWriteAttributeNS
(writer,
(xmlChar *) "rdf",
(xmlChar *) "about",
NULL,
- (xmlChar *) link);
- if (ret < 0) break;
+ safeLink);
+ if (ret < 0)
+ {
+ xmlFree (safeLink);
+ break;
+ }
+ safeTitle = sanitise_string ((const xmlChar *) title);
ret = xmlTextWriterWriteElement
(writer,
(xmlChar *) "title",
- (xmlChar *) title);
+ safeTitle);
+ xmlFree (safeTitle);
if (ret < 0) break;
ret = xmlTextWriterWriteElement
(writer,
(xmlChar *) "link",
- (xmlChar *) link);
+ safeLink);
+ xmlFree (safeLink);
if (ret < 0) break;
if (smart_url)
{
+ xmlChar *safeSmartLink;
+
+ safeSmartLink = sanitise_string ((const xmlChar *) url);
ret = xmlTextWriterWriteElementNS
(writer,
(xmlChar *) "ephy",
(xmlChar *) "smartlink",
NULL,
- (xmlChar *) url);
+ safeSmartLink);
+ xmlFree (safeSmartLink);
if (ret < 0) break;
}
@@ -321,8 +375,6 @@ write_rdf (EphyBookmarks *bookmarks,
if (ret < 0) break;
ret = xmlTextWriterEndElement (writer); /* item */
-
- g_free (link);
}
if (ret < 0) goto out;