diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-05-30 12:14:17 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-05-30 12:14:17 -0400 |
commit | c209d22b3fa767d6df1b2a8686c9bc1dd834296a (patch) | |
tree | 56d88ef61a0deb60c776dfe3d8a89bf3a52d4eb8 | |
parent | 3d0e1f5c85efed8780089186b905f58bba7c44cb (diff) | |
download | glib-bookmarkfile-crash.tar.gz |
gbookmarkfile: Don't crash if we're not visitedbookmarkfile-crash
Rewrite bookmark_item_dump to not crash if any of
the timestamps is NULL. Also, avoid some of the gratitious
extra string copying.
-rw-r--r-- | glib/gbookmarkfile.c | 95 |
1 files changed, 51 insertions, 44 deletions
diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c index 5b612127a..935d45b8a 100644 --- a/glib/gbookmarkfile.c +++ b/glib/gbookmarkfile.c @@ -552,9 +552,7 @@ static gchar * bookmark_item_dump (BookmarkItem *item) { GString *retval; - gchar *added, *visited, *modified; gchar *escaped_uri; - gchar *buffer; /* at this point, we must have at least a registered application; if we don't * we don't screw up the bookmark file, and just skip this item @@ -567,43 +565,61 @@ bookmark_item_dump (BookmarkItem *item) retval = g_string_sized_new (4096); - added = g_date_time_format_iso8601 (item->added); - modified = g_date_time_format_iso8601 (item->modified); - visited = g_date_time_format_iso8601 (item->visited); + g_string_append (retval, " <" XBEL_BOOKMARK_ELEMENT " "); escaped_uri = g_markup_escape_text (item->uri, -1); - buffer = g_strconcat (" <" - XBEL_BOOKMARK_ELEMENT - " " - XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" " - XBEL_ADDED_ATTRIBUTE "=\"", added, "\" " - XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" " - XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n", - NULL); - - g_string_append (retval, buffer); + g_string_append (retval, XBEL_HREF_ATTRIBUTE "=\""); + g_string_append (retval, escaped_uri); + g_string_append (retval , "\" "); g_free (escaped_uri); - g_free (visited); - g_free (modified); - g_free (added); - g_free (buffer); + + if (item->added) + { + char *added; + + added = g_date_time_format_iso8601 (item->added); + g_string_append (retval, XBEL_ADDED_ATTRIBUTE "=\""); + g_string_append (retval, added); + g_string_append (retval, "\" "); + g_free (added); + } + + if (item->modified) + { + char *modified; + + modified = g_date_time_format_iso8601 (item->modified); + g_string_append (retval, XBEL_ADDED_ATTRIBUTE "=\""); + g_string_append (retval, modified); + g_string_append (retval, "\" "); + g_free (modified); + } + + if (item->visited) + { + char *visited; + + visited = g_date_time_format_iso8601 (item->visited); + g_string_append (retval, XBEL_ADDED_ATTRIBUTE "=\""); + g_string_append (retval, visited); + g_string_append (retval, "\" "); + g_free (visited); + } + + g_string_append (retval, "\">\n"); if (item->title) { gchar *escaped_title; escaped_title = g_markup_escape_text (item->title, -1); - buffer = g_strconcat (" " - "<" XBEL_TITLE_ELEMENT ">", - escaped_title, - "</" XBEL_TITLE_ELEMENT ">\n", - NULL); - g_string_append (retval, buffer); + g_string_append (retval, " " "<" XBEL_TITLE_ELEMENT ">"); + g_string_append (retval, escaped_title); + g_string_append (retval, "</" XBEL_TITLE_ELEMENT ">\n"); g_free (escaped_title); - g_free (buffer); } if (item->description) @@ -611,15 +627,11 @@ bookmark_item_dump (BookmarkItem *item) gchar *escaped_desc; escaped_desc = g_markup_escape_text (item->description, -1); - buffer = g_strconcat (" " - "<" XBEL_DESC_ELEMENT ">", - escaped_desc, - "</" XBEL_DESC_ELEMENT ">\n", - NULL); - g_string_append (retval, buffer); + g_string_append (retval, " " "<" XBEL_DESC_ELEMENT ">"); + g_string_append (retval, escaped_desc); + g_string_append (retval, "</" XBEL_DESC_ELEMENT ">\n"); g_free (escaped_desc); - g_free (buffer); } if (item->metadata) @@ -629,17 +641,12 @@ bookmark_item_dump (BookmarkItem *item) metadata = bookmark_metadata_dump (item->metadata); if (metadata) { - buffer = g_strconcat (" " - "<" XBEL_INFO_ELEMENT ">\n", - metadata, - " " - "</" XBEL_INFO_ELEMENT ">\n", - NULL); - retval = g_string_append (retval, buffer); - - g_free (buffer); - g_free (metadata); - } + g_string_append (retval, " " "<" XBEL_INFO_ELEMENT ">\n"); + g_string_append (retval, metadata); + g_string_append (retval, " " "</" XBEL_INFO_ELEMENT ">\n"); + + g_free (metadata); + } } g_string_append (retval, " </" XBEL_BOOKMARK_ELEMENT ">\n"); |