[glib: 1/2] gbookmarkfile: Fix error reporting with unexpected nesting of elements
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 1/2] gbookmarkfile: Fix error reporting with unexpected nesting of elements
- Date: Mon, 30 Jul 2018 22:52:22 +0000 (UTC)
commit 376234f9b25b220ff58dafbc4ba6bfcfc37b6f34
Author: Philip Withnall <withnall endlessm com>
Date: Mon Jul 30 19:10:11 2018 +0100
gbookmarkfile: Fix error reporting with unexpected nesting of elements
The parser state machine for bookmark files did not handle unexpected
nesting of elements, such as a <bookmark> element inside a <title>
element — it would print a critical warning rather than returning a
GError.
Fix that, and add various unit tests for it. The set of tests includes
various other general markup tests as provided by Jussi Judin.
Signed-off-by: Philip Withnall <withnall endlessm com>
https://gitlab.gnome.org/GNOME/glib/issues/1035
glib/gbookmarkfile.c | 60 ++++++++++++++++++++++++++++++++++++---
glib/tests/Makefile.am | 21 ++++++++++++++
glib/tests/bookmarks/fail-18.xbel | 1 +
glib/tests/bookmarks/fail-19.xbel | 1 +
glib/tests/bookmarks/fail-20.xbel | 1 +
glib/tests/bookmarks/fail-21.xbel | 1 +
glib/tests/bookmarks/fail-22.xbel | 1 +
glib/tests/bookmarks/fail-23.xbel | 1 +
glib/tests/bookmarks/fail-24.xbel | 1 +
glib/tests/bookmarks/fail-25.xbel | 1 +
glib/tests/bookmarks/fail-26.xbel | 1 +
glib/tests/bookmarks/fail-27.xbel | 1 +
glib/tests/bookmarks/fail-28.xbel | 1 +
glib/tests/bookmarks/fail-29.xbel | 1 +
glib/tests/bookmarks/fail-30.xbel | 1 +
glib/tests/bookmarks/fail-31.xbel | 1 +
glib/tests/bookmarks/fail-32.xbel | 1 +
glib/tests/bookmarks/fail-33.xbel | 1 +
glib/tests/bookmarks/fail-34.xbel | 1 +
glib/tests/bookmarks/fail-35.xbel | 1 +
glib/tests/bookmarks/fail-36.xbel | 1 +
glib/tests/bookmarks/fail-37.xbel | 1 +
glib/tests/bookmarks/fail-38.xbel | 1 +
23 files changed, 98 insertions(+), 4 deletions(-)
---
diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c
index bbbc66e5d..9057e7690 100644
--- a/glib/gbookmarkfile.c
+++ b/glib/gbookmarkfile.c
@@ -210,7 +210,7 @@ struct _GBookmarkFile
};
/* parser state machine */
-enum
+typedef enum
{
STATE_STARTED = 0,
@@ -228,7 +228,7 @@ enum
STATE_ICON,
STATE_FINISHED
-};
+} ParserState;
static void g_bookmark_file_init (GBookmarkFile *bookmark);
static void g_bookmark_file_clear (GBookmarkFile *bookmark);
@@ -681,7 +681,7 @@ g_bookmark_file_clear (GBookmarkFile *bookmark)
struct _ParseData
{
- gint state;
+ ParserState state;
GHashTable *namespaces;
@@ -1083,6 +1083,43 @@ is_element_full (ParseData *parse_data,
#define IS_ELEMENT(p,s,e) (is_element_full ((p), (s), NULL, (e), '\0'))
#define IS_ELEMENT_NS(p,s,n,e) (is_element_full ((p), (s), (n), (e), '|'))
+static const gchar *
+parser_state_to_element_name (ParserState state)
+{
+ switch (state)
+ {
+ case STATE_STARTED:
+ case STATE_FINISHED:
+ return "(top-level)";
+ case STATE_ROOT:
+ return XBEL_ROOT_ELEMENT;
+ case STATE_BOOKMARK:
+ return XBEL_BOOKMARK_ELEMENT;
+ case STATE_TITLE:
+ return XBEL_TITLE_ELEMENT;
+ case STATE_DESC:
+ return XBEL_DESC_ELEMENT;
+ case STATE_INFO:
+ return XBEL_INFO_ELEMENT;
+ case STATE_METADATA:
+ return XBEL_METADATA_ELEMENT;
+ case STATE_APPLICATIONS:
+ return BOOKMARK_APPLICATIONS_ELEMENT;
+ case STATE_APPLICATION:
+ return BOOKMARK_APPLICATION_ELEMENT;
+ case STATE_GROUPS:
+ return BOOKMARK_GROUPS_ELEMENT;
+ case STATE_GROUP:
+ return BOOKMARK_GROUP_ELEMENT;
+ case STATE_MIME:
+ return MIME_TYPE_ELEMENT;
+ case STATE_ICON:
+ return BOOKMARK_ICON_ELEMENT;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
static void
start_element_raw_cb (GMarkupParseContext *context,
const gchar *element_name,
@@ -1263,8 +1300,23 @@ start_element_raw_cb (GMarkupParseContext *context,
element_name,
BOOKMARK_GROUP_ELEMENT);
break;
+
+ case STATE_TITLE:
+ case STATE_DESC:
+ case STATE_APPLICATION:
+ case STATE_GROUP:
+ case STATE_MIME:
+ case STATE_ICON:
+ case STATE_FINISHED:
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag “%s” inside “%s”"),
+ element_name,
+ parser_state_to_element_name (parse_data->state));
+ break;
+
default:
- g_warn_if_reached ();
+ g_assert_not_reached ();
break;
}
}
diff --git a/glib/tests/Makefile.am b/glib/tests/Makefile.am
index 4c822bf66..2a53ae6fd 100644
--- a/glib/tests/Makefile.am
+++ b/glib/tests/Makefile.am
@@ -143,6 +143,27 @@ dist_test_data += \
bookmarks/fail-15.xbel \
bookmarks/fail-16.xbel \
bookmarks/fail-17.xbel \
+ bookmarks/fail-18.xbel \
+ bookmarks/fail-19.xbel \
+ bookmarks/fail-20.xbel \
+ bookmarks/fail-21.xbel \
+ bookmarks/fail-22.xbel \
+ bookmarks/fail-23.xbel \
+ bookmarks/fail-24.xbel \
+ bookmarks/fail-25.xbel \
+ bookmarks/fail-26.xbel \
+ bookmarks/fail-27.xbel \
+ bookmarks/fail-28.xbel \
+ bookmarks/fail-29.xbel \
+ bookmarks/fail-30.xbel \
+ bookmarks/fail-31.xbel \
+ bookmarks/fail-32.xbel \
+ bookmarks/fail-33.xbel \
+ bookmarks/fail-34.xbel \
+ bookmarks/fail-35.xbel \
+ bookmarks/fail-36.xbel \
+ bookmarks/fail-37.xbel \
+ bookmarks/fail-38.xbel \
bookmarks/valid-01.xbel \
bookmarks/valid-02.xbel \
bookmarks/valid-03.xbel \
diff --git a/glib/tests/bookmarks/fail-18.xbel b/glib/tests/bookmarks/fail-18.xbel
new file mode 100644
index 000000000..10f3d80fb
--- /dev/null
+++ b/glib/tests/bookmarks/fail-18.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><bookmark:application
c=""/><bookmark:application name=""exec=""/
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-19.xbel b/glib/tests/bookmarks/fail-19.xbel
new file mode 100644
index 000000000..ab4edbb8d
--- /dev/null
+++ b/glib/tests/bookmarks/fail-19.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><mime:mime-type></mime:mime-type><bookmark:applications><bookmark:application
name=""exec=""/
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-20.xbel b/glib/tests/bookmarks/fail-20.xbel
new file mode 100644
index 000000000..a00e154d8
--- /dev/null
+++ b/glib/tests/bookmarks/fail-20.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<<><>>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-21.xbel b/glib/tests/bookmarks/fail-21.xbel
new file mode 100644
index 000000000..cf7fbf441
--- /dev/null
+++ b/glib/tests/bookmarks/fail-21.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><bookmark:application
e=""/><bookmark:application name=""exec=""/
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-22.xbel b/glib/tests/bookmarks/fail-22.xbel
new file mode 100644
index 000000000..abc4cebfe
--- /dev/null
+++ b/glib/tests/bookmarks/fail-22.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><bookmark:application
e=""/><bookmark:application name=""exec="">
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-23.xbel b/glib/tests/bookmarks/fail-23.xbel
new file mode 100644
index 000000000..35324addd
--- /dev/null
+++ b/glib/tests/bookmarks/fail-23.xbel
@@ -0,0 +1 @@
+</
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-24.xbel b/glib/tests/bookmarks/fail-24.xbel
new file mode 100644
index 000000000..a8726e66e
--- /dev/null
+++ b/glib/tests/bookmarks/fail-24.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><bookmark:application
n=""/><bookmark:application name=""exec="">
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-25.xbel b/glib/tests/bookmarks/fail-25.xbel
new file mode 100644
index 000000000..e9bc439e9
--- /dev/null
+++ b/glib/tests/bookmarks/fail-25.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><bookmark:applications></bookmark:applications><bookmark:groups><bookmark:group><
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-26.xbel b/glib/tests/bookmarks/fail-26.xbel
new file mode 100644
index 000000000..739aca215
--- /dev/null
+++ b/glib/tests/bookmarks/fail-26.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<><>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-27.xbel b/glib/tests/bookmarks/fail-27.xbel
new file mode 100644
index 000000000..e40209515
--- /dev/null
+++ b/glib/tests/bookmarks/fail-27.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"f=""><title><bookmark:application
e=""/><bookmark:application name=""exec=""/
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-28.xbel b/glib/tests/bookmarks/fail-28.xbel
new file mode 100644
index 000000000..131a97a40
--- /dev/null
+++ b/glib/tests/bookmarks/fail-28.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<><><>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-29.xbel b/glib/tests/bookmarks/fail-29.xbel
new file mode 100644
index 000000000..2cdcf9f1f
--- /dev/null
+++ b/glib/tests/bookmarks/fail-29.xbel
@@ -0,0 +1 @@
+<?></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-30.xbel b/glib/tests/bookmarks/fail-30.xbel
new file mode 100644
index 000000000..982ea1049
--- /dev/null
+++ b/glib/tests/bookmarks/fail-30.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<><<>><>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-31.xbel b/glib/tests/bookmarks/fail-31.xbel
new file mode 100644
index 000000000..4b46cbafd
--- /dev/null
+++ b/glib/tests/bookmarks/fail-31.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<><<>>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-32.xbel b/glib/tests/bookmarks/fail-32.xbel
new file mode 100644
index 000000000..d6de333d1
--- /dev/null
+++ b/glib/tests/bookmarks/fail-32.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-33.xbel b/glib/tests/bookmarks/fail-33.xbel
new file mode 100644
index 000000000..a72c6ff33
--- /dev/null
+++ b/glib/tests/bookmarks/fail-33.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<><><><>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-34.xbel b/glib/tests/bookmarks/fail-34.xbel
new file mode 100644
index 000000000..88214d94e
--- /dev/null
+++ b/glib/tests/bookmarks/fail-34.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE<<>>></
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-35.xbel b/glib/tests/bookmarks/fail-35.xbel
new file mode 100644
index 000000000..2f8fd1091
--- /dev/null
+++ b/glib/tests/bookmarks/fail-35.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"m=""><title><mime:mime-type></mime:mime-type><mime:mime-type>
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-36.xbel b/glib/tests/bookmarks/fail-36.xbel
new file mode 100644
index 000000000..7949a3b95
--- /dev/null
+++ b/glib/tests/bookmarks/fail-36.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><mime:mime-type></mime:mime-type><bookmark:applications><application
name=""exec="">
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-37.xbel b/glib/tests/bookmarks/fail-37.xbel
new file mode 100644
index 000000000..785f3b104
--- /dev/null
+++ b/glib/tests/bookmarks/fail-37.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel
version="1.0"xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><title><mime:mime-type></mime:mime-type><bookmark:applications><bookmark:application
name=""exec="">
\ No newline at end of file
diff --git a/glib/tests/bookmarks/fail-38.xbel b/glib/tests/bookmarks/fail-38.xbel
new file mode 100644
index 000000000..9ef34f3ee
--- /dev/null
+++ b/glib/tests/bookmarks/fail-38.xbel
@@ -0,0 +1 @@
+<?><!DOCTYPE><xbel x=""/><o
xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"><bookmark:application
e=""/><bookmark:application name=""exec=""/
\ No newline at end of file
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]