From 376234f9b25b220ff58dafbc4ba6bfcfc37b6f34 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 30 Jul 2018 19:10:11 +0100 Subject: [PATCH] gbookmarkfile: Fix error reporting with unexpected nesting of elements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The parser state machine for bookmark files did not handle unexpected nesting of elements, such as a element inside a 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(-) create mode 100644 glib/tests/bookmarks/fail-18.xbel create mode 100644 glib/tests/bookmarks/fail-19.xbel create mode 100644 glib/tests/bookmarks/fail-20.xbel create mode 100644 glib/tests/bookmarks/fail-21.xbel create mode 100644 glib/tests/bookmarks/fail-22.xbel create mode 100644 glib/tests/bookmarks/fail-23.xbel create mode 100644 glib/tests/bookmarks/fail-24.xbel create mode 100644 glib/tests/bookmarks/fail-25.xbel create mode 100644 glib/tests/bookmarks/fail-26.xbel create mode 100644 glib/tests/bookmarks/fail-27.xbel create mode 100644 glib/tests/bookmarks/fail-28.xbel create mode 100644 glib/tests/bookmarks/fail-29.xbel create mode 100644 glib/tests/bookmarks/fail-30.xbel create mode 100644 glib/tests/bookmarks/fail-31.xbel create mode 100644 glib/tests/bookmarks/fail-32.xbel create mode 100644 glib/tests/bookmarks/fail-33.xbel create mode 100644 glib/tests/bookmarks/fail-34.xbel create mode 100644 glib/tests/bookmarks/fail-35.xbel create mode 100644 glib/tests/bookmarks/fail-36.xbel create mode 100644 glib/tests/bookmarks/fail-37.xbel create mode 100644 glib/tests/bookmarks/fail-38.xbel 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