Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
Date:                    2019-09-10
Initial Package Version: 0.7.0
Upstream Status:         Submitted (PR)
Origin:                  Self
Description:             Fixes several bugs in libgrss. This includes porting
                         to the new libsoup API, fixing memory leaks, bumping
                         the version to the one that tracker-miners wants,
                         fixing signal emission problems, upgrading g-i files,
                         fixing authentication bugs, and porting from
                         GSimpleAsync to GTask.

diff -Naurp libgrss-0.7.0.orig/configure.ac libgrss-0.7.0/configure.ac
--- libgrss-0.7.0.orig/configure.ac	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/configure.ac	2019-04-10 00:01:12.448526750 -0500
@@ -2,13 +2,13 @@
 # bump micro_version to the next odd number after each release
 m4_define([grss_major_version], [0])
 m4_define([grss_minor_version], [7])
-m4_define([grss_micro_version], [0])
+m4_define([grss_micro_version], [1])
 m4_define([grss_version],
           [grss_major_version.grss_minor_version.grss_micro_version])
 
 # bump up by 1 for every micro release with no API changes, otherwise
 # set to 0. after release, bump up by 1
-m4_define([grss_interface_age], [0])
+m4_define([grss_interface_age], [1])
 m4_define([grss_binary_age], [m4_eval(100 * grss_minor_version + grss_micro_version)])
 
 m4_define([lt_current], [m4_eval(100 * grss_minor_version + grss_micro_version - grss_interface_age)])
diff -Naurp libgrss-0.7.0.orig/doc/reference/libgrss-docs.sgml libgrss-0.7.0/doc/reference/libgrss-docs.sgml
--- libgrss-0.7.0.orig/doc/reference/libgrss-docs.sgml	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/doc/reference/libgrss-docs.sgml	2019-04-09 23:51:42.414042258 -0500
@@ -55,7 +55,6 @@
 
     <xi:include href="xml/feed-atom-handler.xml"/>
     <xi:include href="xml/feed-handler.xml"/>
-    <xi:include href="xml/feed-marshal.xml"/>
     <xi:include href="xml/feed-pie-handler.xml"/>
     <xi:include href="xml/feed-rss-handler.xml"/>
     <xi:include href="xml/feeds-group-handler.xml"/>
diff -Naurp libgrss-0.7.0.orig/doc/reference/version.xml.in libgrss-0.7.0/doc/reference/version.xml.in
--- libgrss-0.7.0.orig/doc/reference/version.xml.in	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/doc/reference/version.xml.in	2019-04-10 00:01:52.056757372 -0500
@@ -1 +1 @@
-@LIBGRSS_VERSION@
+@GRSS_VERSION@
diff -Naurp libgrss-0.7.0.orig/src/feed-atom-handler.c libgrss-0.7.0/src/feed-atom-handler.c
--- libgrss-0.7.0.orig/src/feed-atom-handler.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-atom-handler.c	2019-04-10 00:28:07.125200045 -0500
@@ -63,6 +63,14 @@ feed_atom_handler_error_quark ()
 static void
 feed_atom_handler_finalize (GObject *object)
 {
+   /* Ensure that the Feed Atom Handler's hash tables and objects are cleared
+    * properly. Without this, we risk triggering a memory leak. */
+   FeedAtomHandler *self = FEED_ATOM_HANDLER (object);
+
+   g_clear_object (&self->priv->handler);
+   g_hash_table_destroy (self->priv->feed_elements_hash);
+   g_hash_table_destroy (self->priv->entry_elements_hash);
+
 	G_OBJECT_CLASS (feed_atom_handler_parent_class)->finalize (object);
 }
 
@@ -329,6 +337,8 @@ atom10_parse_link (xmlNodePtr cur, GrssF
 	const gchar *home;
 	gchar *alternate = NULL;
 
+   g_return_val_if_fail (GRSS_IS_FEED_CHANNEL (feed), NULL);
+
 	href = (gchar*) xmlGetNsProp (cur, BAD_CAST"href", NULL);
 
 	if (href) {
@@ -384,11 +394,9 @@ atom10_parse_link (xmlNodePtr cur, GrssF
 			*/
 		}
 		else if (g_str_equal (relation, "hub")) {
-			if (feed != NULL)
 				grss_feed_channel_set_pubsubhub (feed, url);
 		}
 		else if (g_str_equal (relation, "self")) {
-			if (feed != NULL)
 				grss_feed_channel_set_source (feed, url);
 		}
 
@@ -782,7 +790,7 @@ feed_atom_handler_parse (FeedHandler *se
 	parser = FEED_ATOM_HANDLER (self);
 
 	while (TRUE) {
-		if (xmlStrcmp (cur->name, BAD_CAST"feed")) {
+		if (!cur || xmlStrcmp (cur->name, BAD_CAST"feed")) {
 			g_set_error (error, FEED_ATOM_HANDLER_ERROR, FEED_ATOM_HANDLER_PARSE_ERROR, "Could not find Atom 1.0 header!");
 			break;
 		}
diff -Naurp libgrss-0.7.0.orig/src/feed-channel.c libgrss-0.7.0/src/feed-channel.c
--- libgrss-0.7.0.orig/src/feed-channel.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-channel.c	2019-04-10 00:45:23.191159682 -0500
@@ -103,6 +103,8 @@ grss_feed_channel_finalize (GObject *obj
 	FREE_STRING (chan->priv->rsscloud.path);
 	FREE_STRING (chan->priv->rsscloud.protocol);
 	FREE_STRING (chan->priv->copyright);
+   FREE_STRING (chan->priv->format);
+   FREE_STRING (chan->priv->source);
 	if (chan->priv->editor)
 		grss_person_unref (chan->priv->editor);
 	FREE_STRING (chan->priv->webmaster);
@@ -215,6 +217,7 @@ GrssFeedChannel*
 grss_feed_channel_new_from_memory (const gchar *data, GError **error)
 {
 	xmlDocPtr doc;
+   GrssFeedChannel *ret;
 
 	doc = content_to_xml (data, strlen (data));
 	if (doc == NULL) {
@@ -222,7 +225,11 @@ grss_feed_channel_new_from_memory (const
 		return NULL;
 	}
 
-	return grss_feed_channel_new_from_xml (doc, error);
+	ret = grss_feed_channel_new_from_xml (doc, error);
+
+   xmlFreeDoc (doc);
+
+   return ret;
 }
 
 /**
@@ -944,7 +951,6 @@ static gboolean
 quick_and_dirty_parse (GrssFeedChannel *channel, SoupMessage *msg, GList **save_items)
 {
 	GList *items;
-	GList *iter;
 	xmlDocPtr doc;
 	GrssFeedParser *parser;
 
@@ -1010,7 +1016,7 @@ grss_feed_channel_fetch (GrssFeedChannel
 
 	ret = FALSE;
 
-	session = soup_session_sync_new ();
+	session = soup_session_new ();
 	init_soup_session (session, channel);
 
 	msg = soup_message_new ("GET", grss_feed_channel_get_source (channel));
@@ -1036,26 +1042,27 @@ grss_feed_channel_fetch (GrssFeedChannel
 static void
 feed_downloaded (SoupSession *session, SoupMessage *msg, gpointer user_data) {
 	guint status;
-	GSimpleAsyncResult *result;
+   GTask *task;
 	GrssFeedChannel *channel;
 
-	result = user_data;
-	channel = GRSS_FEED_CHANNEL (g_async_result_get_source_object (G_ASYNC_RESULT (result)));
+	task = user_data;
+	channel = GRSS_FEED_CHANNEL (g_task_get_source_object (task));
 	g_object_get (msg, "status-code", &status, NULL);
 
 	if (status >= 200 && status <= 299) {
 		if (quick_and_dirty_parse (channel, msg, NULL) == FALSE)
-			g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR,
+			g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR,
 						 "Unable to parse feed from %s", grss_feed_channel_get_source (channel));
+      else
+         g_task_return_boolean (task, TRUE);
 	}
 	else {
-		g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR,
+		g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR,
 						 "Unable to download from %s", grss_feed_channel_get_source (channel));
 	}
 
-	g_simple_async_result_complete_in_idle (result);
 	g_clear_object (&channel->priv->fetchcancel);
-	g_object_unref (result);
+	g_object_unref (task);
 }
 
 /**
@@ -1074,10 +1081,7 @@ feed_downloaded (SoupSession *session, S
 gboolean
 grss_feed_channel_fetch_finish (GrssFeedChannel *channel, GAsyncResult *res, GError **error)
 {
-	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
-		return FALSE;
-	else
-		return TRUE;
+   return g_task_propagate_boolean (G_TASK (res), error);
 }
 
 static void
@@ -1098,7 +1102,7 @@ do_prefetch (GrssFeedChannel *channel)
 void
 grss_feed_channel_fetch_async (GrssFeedChannel *channel, GAsyncReadyCallback callback, gpointer user_data)
 {
-	GSimpleAsyncResult *result;
+	GTask *task;
 	SoupMessage *msg;
 	SoupSession *session;
 
@@ -1107,16 +1111,15 @@ grss_feed_channel_fetch_async (GrssFeedC
 	*/
 
 	do_prefetch (channel);
-	result = g_simple_async_result_new (G_OBJECT (channel), callback, user_data, grss_feed_channel_fetch_async);
-	g_simple_async_result_set_check_cancellable (result, channel->priv->fetchcancel);
+	task = g_task_new (channel, channel->priv->fetchcancel, callback, user_data);
 
-	session = soup_session_async_new ();
+	session = soup_session_new ();
 	init_soup_session (session, channel);
 
 	msg = soup_message_new ("GET", grss_feed_channel_get_source (channel));
 	init_soup_message (msg, channel);
 
-	soup_session_queue_message (session, msg, feed_downloaded, result);
+	soup_session_queue_message (session, msg, feed_downloaded, task);
 }
 
 /**
@@ -1140,7 +1143,7 @@ grss_feed_channel_fetch_all (GrssFeedCha
 	SoupMessage *msg;
 	SoupSession *session;
 
-	session = soup_session_sync_new ();
+	session = soup_session_new ();
 	init_soup_session (session, channel);
 
 	msg = soup_message_new ("GET", grss_feed_channel_get_source (channel));
@@ -1182,30 +1185,29 @@ feed_downloaded_return_items (SoupSessio
 {
 	guint status;
 	GList *items;
-	GSimpleAsyncResult *result;
+	GTask *task;
 	GrssFeedChannel *channel;
 
-	result = user_data;
-	channel = GRSS_FEED_CHANNEL (g_async_result_get_source_object (G_ASYNC_RESULT (result)));
+	task = user_data;
+	channel = GRSS_FEED_CHANNEL (g_task_get_source_object (task));
 	g_object_get (msg, "status-code", &status, NULL);
 
 	if (status >= 200 && status <= 299) {
 		items = NULL;
 
 		if (quick_and_dirty_parse (channel, msg, &items) == TRUE)
-			g_simple_async_result_set_op_res_gpointer (result, items, free_items_list);
+			g_task_return_pointer (task, items, free_items_list);
 		else
-			g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR,
+			g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_PARSE_ERROR,
 						 "Unable to parse feed from %s", grss_feed_channel_get_source (channel));
 	}
 	else {
-		g_simple_async_result_set_error (result, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR,
+		g_task_return_new_error (task, FEED_CHANNEL_ERROR, FEED_CHANNEL_FETCH_ERROR,
 						 "Unable to download from %s", grss_feed_channel_get_source (channel));
 	}
 
-	g_simple_async_result_complete_in_idle (result);
 	g_clear_object (&channel->priv->fetchcancel);
-	g_object_unref (result);
+	g_object_unref (task);
 }
 
 /**
@@ -1219,21 +1221,20 @@ feed_downloaded_return_items (SoupSessio
 void
 grss_feed_channel_fetch_all_async (GrssFeedChannel *channel, GAsyncReadyCallback callback, gpointer user_data)
 {
-	GSimpleAsyncResult *result;
+	GTask *task;
 	SoupMessage *msg;
 	SoupSession *session;
 
 	do_prefetch (channel);
-	result = g_simple_async_result_new (G_OBJECT (channel), callback, user_data, grss_feed_channel_fetch_async);
-	g_simple_async_result_set_check_cancellable (result, channel->priv->fetchcancel);
+	task = g_task_new (channel, channel->priv->fetchcancel, callback, user_data);
 
-	session = soup_session_async_new ();
+	session = soup_session_new ();
 	init_soup_session (session, channel);
 
 	msg = soup_message_new ("GET", grss_feed_channel_get_source (channel));
 	init_soup_message (msg, channel);
 
-	soup_session_queue_message (session, msg, feed_downloaded_return_items, result);
+	soup_session_queue_message (session, msg, feed_downloaded_return_items, task);
 }
 
 /**
@@ -1254,10 +1255,7 @@ grss_feed_channel_fetch_all_async (GrssF
 GList*
 grss_feed_channel_fetch_all_finish (GrssFeedChannel *channel, GAsyncResult *res, GError **error)
 {
-	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
-		return NULL;
-	else
-		return (GList*) g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+	return g_task_propagate_pointer (G_TASK (res), error);
 }
 
 /**
@@ -1275,11 +1273,10 @@ grss_feed_channel_fetch_cancel (GrssFeed
 {
 	if (channel->priv->fetchcancel != NULL) {
 		g_cancellable_cancel (channel->priv->fetchcancel);
-		g_object_unref (channel->priv->fetchcancel);
+		g_clear_object (&channel->priv->fetchcancel);
 		return TRUE;
 	}
 	else {
 		return FALSE;
 	}
 }
-
diff -Naurp libgrss-0.7.0.orig/src/feed-enclosure.c libgrss-0.7.0/src/feed-enclosure.c
--- libgrss-0.7.0.orig/src/feed-enclosure.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feed-enclosure.c	2019-04-10 00:21:24.288851984 -0500
@@ -219,7 +219,7 @@ grss_feed_enclosure_fetch (GrssFeedEnclo
 	ret = NULL;
 	url = grss_feed_enclosure_get_url (enclosure);
 
-	session = soup_session_sync_new ();
+	session = soup_session_new ();
 	msg = soup_message_new ("GET", url);
 	status = soup_session_send_message (session, msg);
 
@@ -239,12 +239,12 @@ enclosure_downloaded (SoupSession *sessi
 	guint status;
 	const gchar *url;
 	GFile *file;
-	GSimpleAsyncResult *result;
+	GTask *task;
 	GrssFeedEnclosure *enclosure;
 	GError *error;
 
-	result = user_data;
-	enclosure = GRSS_FEED_ENCLOSURE (g_async_result_get_source_object (G_ASYNC_RESULT (result)));
+	task = user_data;
+	enclosure = GRSS_FEED_ENCLOSURE (g_task_get_source_object (task));
 	url = grss_feed_enclosure_get_url (enclosure);
 	g_object_get (msg, "status-code", &status, NULL);
 
@@ -253,17 +253,16 @@ enclosure_downloaded (SoupSession *sessi
 		file = msg_to_internal_file (enclosure, msg, &error);
 
 		if (file != NULL)
-			g_simple_async_result_set_op_res_gpointer (result, file, g_object_unref);
+			g_task_return_pointer (task, file, g_object_unref);
 		else
-			g_simple_async_result_take_error (result, error);
+			g_task_return_error (task, error);
 	}
 	else {
-		g_simple_async_result_set_error (result, FEED_ENCLOSURE_ERROR, FEED_ENCLOSURE_FETCH_ERROR,
+		g_task_return_new_error (task, FEED_ENCLOSURE_ERROR, FEED_ENCLOSURE_FETCH_ERROR,
 						 "Unable to download from %s", url);
 	}
 
-	g_simple_async_result_complete_in_idle (result);
-	g_object_unref (result);
+	g_object_unref (task);
 }
 
 /**
@@ -277,14 +276,14 @@ enclosure_downloaded (SoupSession *sessi
 void
 grss_feed_enclosure_fetch_async (GrssFeedEnclosure *enclosure, GAsyncReadyCallback callback, gpointer user_data)
 {
-	GSimpleAsyncResult *result;
+	GTask *task;
 	SoupMessage *msg;
 	SoupSession *session;
 
-	result = g_simple_async_result_new (G_OBJECT (enclosure), callback, user_data, grss_feed_enclosure_fetch_async);
-	session = soup_session_async_new ();
+	task = g_task_new (enclosure, NULL, callback, user_data);
+	session = soup_session_new ();
 	msg = soup_message_new ("GET", grss_feed_enclosure_get_url (enclosure));
-	soup_session_queue_message (session, msg, enclosure_downloaded, result);
+	soup_session_queue_message (session, msg, enclosure_downloaded, task);
 }
 
 /**
@@ -303,8 +302,5 @@ grss_feed_enclosure_fetch_async (GrssFee
 GFile*
 grss_feed_enclosure_fetch_finish (GrssFeedEnclosure *enclosure, GAsyncResult *res, GError **error)
 {
-	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
-		return NULL;
-	else
-		return (GFile*) g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+	return g_task_propagate_pointer (G_TASK (res), error);
 }
diff -Naurp libgrss-0.7.0.orig/src/feed-item.c libgrss-0.7.0/src/feed-item.c
--- libgrss-0.7.0.orig/src/feed-item.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-item.c	2019-04-10 00:02:49.610543227 -0500
@@ -136,7 +136,6 @@ grss_feed_item_new (GrssFeedChannel *par
 
 	item = GRSS_FEED_ITEM (g_object_new (GRSS_FEED_ITEM_TYPE, NULL));
 	item->priv->parent = parent;
-	item->priv->pub_time = time (NULL);
 	return item;
 }
 
diff -Naurp libgrss-0.7.0.orig/src/feed-parser.c libgrss-0.7.0/src/feed-parser.c
--- libgrss-0.7.0.orig/src/feed-parser.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feed-parser.c	2019-04-09 23:31:31.714083101 -0500
@@ -65,6 +65,9 @@ grss_feed_parser_error_quark ()
 static void
 grss_feed_parser_finalize (GObject *object)
 {
+   GrssFeedParser *parser = GRSS_FEED_PARSER (object);
+   g_slist_free_full (parser->priv->handlers, g_object_unref);
+
 	G_OBJECT_CLASS (grss_feed_parser_parent_class)->finalize (object);
 }
 
@@ -89,24 +92,26 @@ feed_parsers_get_list (GrssFeedParser *p
 	FeedHandler *feed;
 	NSHandler *ns;
 
-	ns = ns_handler_new ();
-
 	if (parser->priv->handlers == NULL) {
 		/*
-			TODO	Parsers may be dinamically loaded and managed as external plugins
+			TODO	Parsers may be dynamically loaded and managed as external plugins
 		*/
 
+      ns = ns_handler_new (); 
+
 		feed = FEED_HANDLER (feed_rss_handler_new ());
-		feed_handler_set_ns_handler (feed, ns);
+		feed_handler_set_ns_handler (feed, g_object_ref (ns));
 		parser->priv->handlers = g_slist_append (parser->priv->handlers, feed);
 
 		feed = FEED_HANDLER (feed_atom_handler_new ());					/* Must be before pie */
-		feed_handler_set_ns_handler (feed, ns);
+		feed_handler_set_ns_handler (feed, g_object_ref (ns));
 		parser->priv->handlers = g_slist_append (parser->priv->handlers, feed);
 
 		feed = FEED_HANDLER (feed_pie_handler_new ());
-		feed_handler_set_ns_handler (feed, ns);
+		feed_handler_set_ns_handler (feed, g_object_ref (ns));
 		parser->priv->handlers = g_slist_append (parser->priv->handlers, feed);
+
+      g_object_unref (ns);
 	}
 
 	return parser->priv->handlers;
diff -Naurp libgrss-0.7.0.orig/src/feed-pie-handler.c libgrss-0.7.0/src/feed-pie-handler.c
--- libgrss-0.7.0.orig/src/feed-pie-handler.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-pie-handler.c	2019-04-10 00:24:39.979851646 -0500
@@ -62,7 +62,11 @@ feed_pie_handler_error_quark ()
 static void
 feed_pie_handler_finalize (GObject *object)
 {
-	G_OBJECT_CLASS (feed_pie_handler_parent_class)->finalize (object);
+	FeedPieHandler *self = FEED_PIE_HANDLER (object);
+
+   g_clear_object (&self->priv->handler);
+   
+   G_OBJECT_CLASS (feed_pie_handler_parent_class)->finalize (object);
 }
 
 static void
@@ -326,7 +330,7 @@ feed_pie_handler_parse (FeedHandler *sel
 		cur = cur->next;
 
 	while (TRUE) {
-		if (xmlStrcmp (cur->name, BAD_CAST"feed")) {
+		if (!cur || xmlStrcmp (cur->name, BAD_CAST"feed")) {
 			g_set_error (error, FEED_PIE_HANDLER_ERROR, FEED_PIE_HANDLER_PARSE_ERROR, "Could not find Atom/PIE header!");
 			break;
 		}
diff -Naurp libgrss-0.7.0.orig/src/feed-rss-formatter.c libgrss-0.7.0/src/feed-rss-formatter.c
--- libgrss-0.7.0.orig/src/feed-rss-formatter.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-rss-formatter.c	2019-04-09 23:35:19.729038185 -0500
@@ -41,8 +41,7 @@ feed_rss_formatter_format (GrssFeedForma
 	time_t date;
 	GList *iter;
 	GList *items;
-        GrssPerson *person;
-	const GList *list;
+   GrssPerson *person;
 	GString *text;
 	GrssFeedChannel *channel;
 	GrssFeedItem *item;
diff -Naurp libgrss-0.7.0.orig/src/feed-rss-handler.c libgrss-0.7.0/src/feed-rss-handler.c
--- libgrss-0.7.0.orig/src/feed-rss-handler.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feed-rss-handler.c	2019-04-10 00:26:49.126809861 -0500
@@ -75,6 +75,11 @@ feed_rss_handler_error_quark ()
 static void
 feed_rss_handler_finalize (GObject *object)
 {
+
+   FeedRssHandler *self = FEED_RSS_HANDLER (object);
+
+   g_clear_object (&self->priv->handler);
+
 	G_OBJECT_CLASS (feed_rss_handler_parent_class)->finalize (object);
 }
 
@@ -452,16 +457,17 @@ feed_rss_handler_parse (FeedHandler *sel
 	while (cur && xmlIsBlankNode (cur))
 		cur = cur->next;
 
-	if (!xmlStrcmp (cur->name, BAD_CAST"rss")) {
+	if (cur && !xmlStrcmp (cur->name, BAD_CAST"rss")) {
 		cur = cur->xmlChildrenNode;
 		rdf = FALSE;
 	}
-	else if (!xmlStrcmp (cur->name, BAD_CAST"rdf") ||
-	         !xmlStrcmp (cur->name, BAD_CAST"RDF")) {
+	else if (cur &&
+      (!xmlStrcmp (cur->name, BAD_CAST"rdf") ||
+	    !xmlStrcmp (cur->name, BAD_CAST"RDF"))) {
 		cur = cur->xmlChildrenNode;
 		rdf = TRUE;
 	}
-	else if (!xmlStrcmp (cur->name, BAD_CAST"Channel")) {
+	else if (cur && !xmlStrcmp (cur->name, BAD_CAST"Channel")) {
 		rdf = FALSE;
 	}
 	else {
diff -Naurp libgrss-0.7.0.orig/src/feeds-group.c libgrss-0.7.0/src/feeds-group.c
--- libgrss-0.7.0.orig/src/feeds-group.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feeds-group.c	2019-04-10 00:37:07.985868698 -0500
@@ -238,7 +238,7 @@ grss_feeds_group_parse_file (GrssFeedsGr
  * @error: location for eventual errors.
  *
  * Creates a new file with the list of @channels rappresented in the required
- * @format. It a file already exists at the @uri location, it is overwritten.
+ * @format. It the file already exists at the @uri location, it is overwritten.
  *
  * Returns: %TRUE if the file is created correctly, or %FALSE if an error
  * occours and @error is set.
@@ -273,7 +273,7 @@ grss_feeds_group_export_file (GrssFeedsG
 			}
 
 			file = g_file_new_for_uri (uri);
-			stream = g_file_append_to (file, G_FILE_CREATE_NONE, NULL, &err);
+			stream = g_file_replace (file, NULL, TRUE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, &err);
 
 			if (stream == NULL) {
 				g_propagate_error (error, err);
diff -Naurp libgrss-0.7.0.orig/src/feeds-pool.c libgrss-0.7.0/src/feeds-pool.c
--- libgrss-0.7.0.orig/src/feeds-pool.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feeds-pool.c	2019-04-10 00:53:11.331558847 -0500
@@ -177,7 +177,7 @@ grss_feeds_pool_init (GrssFeedsPool *nod
 	node->priv = FEEDS_POOL_GET_PRIVATE (node);
 	memset (node->priv, 0, sizeof (GrssFeedsPoolPrivate));
 	node->priv->parser = grss_feed_parser_new ();
-	node->priv->soupsession = soup_session_async_new ();
+	node->priv->soupsession = soup_session_new ();
 }
 
 /**
@@ -291,19 +291,21 @@ feed_downloaded (GObject *source, GAsync
 {
 	GList *items;
 	GrssFeedChannelWrap *feed;
+   GError *error = NULL;
 
 	feed = (GrssFeedChannelWrap*) user_data;
 	if (feed->pool->priv->running == FALSE)
 		return;
 
-	items = grss_feed_channel_fetch_all_finish (GRSS_FEED_CHANNEL (source), res, NULL);
+	items = grss_feed_channel_fetch_all_finish (GRSS_FEED_CHANNEL (source), res, &error);
 
-	if (items != NULL)
+	if (error == NULL)
 		g_signal_emit (feed->pool, signals [FEED_READY], 0, feed->channel, items, NULL);
 	else
 		g_signal_emit (feed->pool, signals [FEED_FAIL], 0, feed->channel, NULL);
 
 	feed->next_fetch = time (NULL) + (grss_feed_channel_get_update_interval (feed->channel) * 60);
+   g_clear_error (&error);
 }
 
 static gboolean
@@ -324,9 +326,11 @@ fetch_feeds (gpointer data)
 
 	for (iter = pool->priv->feeds_list; iter; iter = g_list_next (iter)) {
 		feed = (GrssFeedChannelWrap*) iter->data;
-		if (feed->next_fetch <= now)
+		if (feed->next_fetch <= now) {
+         g_signal_emit (feed->pool, signals[FEED_FETCHING], 0, feed->channel);
 			grss_feed_channel_fetch_all_async (feed->channel, feed_downloaded, feed);
-	}
+	   }
+   }
 
 	return TRUE;
 }
diff -Naurp libgrss-0.7.0.orig/src/feeds-publisher.c libgrss-0.7.0/src/feeds-publisher.c
--- libgrss-0.7.0.orig/src/feeds-publisher.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/feeds-publisher.c	2019-04-10 00:34:22.232723193 -0500
@@ -102,7 +102,7 @@ enum {
 G_DEFINE_TYPE (GrssFeedsPublisher, grss_feeds_publisher, G_TYPE_OBJECT);
 
 static GQuark
-feeds_publisher_error_quark ()
+feeds_publisher_error_quark (void)
 {
 	return g_quark_from_static_string ("feeds_publisher_error");
 }
@@ -219,7 +219,7 @@ grss_feeds_publisher_init (GrssFeedsPubl
  * Returns: a new #GrssFeedsPublisher.
  */
 GrssFeedsPublisher*
-grss_feeds_publisher_new ()
+grss_feeds_publisher_new (void)
 {
 	return g_object_new (FEEDS_PUBLISHER_TYPE, NULL);
 }
@@ -624,7 +624,7 @@ remove_client_to_topic (GrssFeedsPublish
 }
 
 static gchar*
-random_string ()
+random_string (void)
 {
 	register int i;
 	gchar str [50];
@@ -663,7 +663,7 @@ verification_message_for_client (RemoteS
 			break;
 	}
 
-	body = g_strdup_printf ("%s?hub.mode=%s&hub.topic=%s&hub.challenge=%s&hub.lease_seconds=%lld",
+	body = g_strdup_printf ("%s?hub.mode=%s&hub.topic=%s&hub.challenge=%s&hub.lease_seconds=%ld",
 				client->callback, mode, client->topic, client->challenge, client->lease_interval);
 
 	ret = soup_message_new ("GET", body);
@@ -840,12 +840,18 @@ handle_incoming_requests_cb (SoupServer
 			}
 		}
 		else if (strcmp (mode, "unsubscribe") == 0) {
-			client = search_subscriber_by_topic_and_callback (pub, topic, callback);
-			if (client != NULL)
-				client->status = REMOTE_UNSUBSCRIBING;
+			if (callback == NULL) {
+            soup_message_set_status (msg, 400);
+         }
+         else {
+            client = search_subscriber_by_topic_and_callback (pub, topic, callback);
+
+            if (client != NULL)
+               client->status = REMOTE_UNSUBSCRIBING;
+         }
 		}
 
-		if (client != NULL) {
+		if (client != NULL && verify != NULL) {
 			verify_msg = verification_message_for_client (client);
 
 			if (strcmp (verify, "sync") == 0) {
@@ -859,6 +865,9 @@ handle_incoming_requests_cb (SoupServer
 				soup_message_set_status (msg, 202);
 			}
 		}
+      else if (client != NULL) {
+         soup_message_set_status (msg, 400);
+      }
 	}
 
 	g_strfreev (contents);
@@ -869,7 +878,7 @@ close_server (GrssFeedsPublisher *pub)
 {
 	if (pub->priv->server != NULL) {
 		soup_server_remove_handler (pub->priv->server, NULL);
-		soup_server_quit (pub->priv->server);
+		soup_server_disconnect (pub->priv->server);
 		g_object_unref (pub->priv->server);
 		pub->priv->server = NULL;
 	}
@@ -881,14 +890,15 @@ create_and_run_server (GrssFeedsPublishe
 	SoupAddress *soup_addr;
 
 	if (pub->priv->soupsession == NULL)
-		pub->priv->soupsession = soup_session_async_new ();
+		pub->priv->soupsession = soup_session_new ();
 
 	soup_addr = soup_address_new_any (SOUP_ADDRESS_FAMILY_IPV4, pub->priv->port);
 	pub->priv->server = soup_server_new ("port", pub->priv->port, "interface", soup_addr, NULL);
 	g_object_unref (soup_addr);
 
 	soup_server_add_handler (pub->priv->server, NULL, handle_incoming_requests_cb, pub, NULL);
-	soup_server_run_async (pub->priv->server);
+   /* TODO - Add IPv6 support - Send PR upstream */
+	soup_server_listen_all (pub->priv->server, pub->priv->port, SOUP_SERVER_LISTEN_IPV4_ONLY, NULL);
 }
 
 /**
diff -Naurp libgrss-0.7.0.orig/src/feeds-publisher.h libgrss-0.7.0/src/feeds-publisher.h
--- libgrss-0.7.0.orig/src/feeds-publisher.h	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feeds-publisher.h	2019-04-10 00:34:54.054712602 -0500
@@ -45,9 +45,9 @@ typedef struct {
 	void (*delete_subscription) (GrssFeedsPublisher *pub, GrssFeedChannel *topic, gchar *callback);
 } GrssFeedsPublisherClass;
 
-GType			grss_feeds_publisher_get_type		() G_GNUC_CONST;
+GType			grss_feeds_publisher_get_type		(void) G_GNUC_CONST;
 
-GrssFeedsPublisher*	grss_feeds_publisher_new		();
+GrssFeedsPublisher*	grss_feeds_publisher_new		(void);
 
 gchar*			grss_feeds_publisher_format_content	(GrssFeedsPublisher *pub, GrssFeedChannel *channel, GList *items, GError **error);
 gboolean		grss_feeds_publisher_publish_web	(GrssFeedsPublisher *pub, GrssFeedChannel *channel, GList *items, const gchar *id, GError **error);
diff -Naurp libgrss-0.7.0.orig/src/feeds-subscriber.c libgrss-0.7.0/src/feeds-subscriber.c
--- libgrss-0.7.0.orig/src/feeds-subscriber.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/feeds-subscriber.c	2019-04-09 23:47:50.782967714 -0500
@@ -389,7 +389,7 @@ close_server (GrssFeedsSubscriber *sub)
 {
 	if (sub->priv->server != NULL) {
 		unregister_handlers (sub);
-		soup_server_quit (sub->priv->server);
+		soup_server_disconnect (sub->priv->server);
 		g_object_unref (sub->priv->server);
 		sub->priv->server = NULL;
 	}
@@ -514,7 +514,7 @@ init_run_server (GrssFeedsSubscriber *su
 	GInetAddress *addr;
 
 	if (sub->priv->soupsession == NULL)
-		sub->priv->soupsession = soup_session_async_new ();
+		sub->priv->soupsession = soup_session_new ();
 
 	/*
 		Flow:
diff -Naurp libgrss-0.7.0.orig/src/Makefile.am libgrss-0.7.0/src/Makefile.am
--- libgrss-0.7.0.orig/src/Makefile.am	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/Makefile.am	2019-04-10 00:22:54.753625871 -0500
@@ -1,4 +1,4 @@
-SUBDIRS = tests
+SUBDIRS = . tests
 
 NULL =
 
@@ -128,6 +128,8 @@ introspection_sources = \
 
 Grss-0.7.gir: libgrss.la
 Grss_0_7_gir_INCLUDES = GObject-2.0 Gio-2.0 Soup-2.4 libxml2-2.0
+Grss_0_7_gir_C_INCLUDES = libgrss.h
+Grss_0_7_gir_EXPORT_PACKAGES = libgrss_
 Grss_0_7_gir_CFLAGS = $(INCLUDES)
 Grss_0_7_gir_LIBS = libgrss.la
 Grss_0_7_gir_FILES = $(introspection_sources)
diff -Naurp libgrss-0.7.0.orig/src/ns-handler.c libgrss-0.7.0/src/ns-handler.c
--- libgrss-0.7.0.orig/src/ns-handler.c	2015-07-18 16:43:44.000000000 -0500
+++ libgrss-0.7.0/src/ns-handler.c	2019-04-09 23:48:42.071534115 -0500
@@ -502,7 +502,7 @@ ns_handler_init (NSHandler *node)
 	memset (node->priv, 0, sizeof (NSHandlerPrivate));
 
 	node->priv->href_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
-	node->priv->prefix_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
+	node->priv->prefix_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
 
 	nsh = g_new0 (InternalNsHandler, 1);
 	nsh->handle_channel = ns_admin_channel;
@@ -545,7 +545,7 @@ ns_handler_init (NSHandler *node)
 	nsh->handle_item = ns_dc_item;
 	g_hash_table_insert (node->priv->prefix_handlers, "dc", nsh);
 	g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.1/", nsh);
-	g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.0/", nsh);
+	g_hash_table_insert (node->priv->href_handlers, "http://purl.org/dc/elements/1.0/", g_memdup (nsh, sizeof(InternalNsHandler)));
 
 	nsh = g_new0 (InternalNsHandler, 1);
 	nsh->handle_channel = NULL;
diff -Naurp libgrss-0.7.0.orig/src/tests/formatter.c libgrss-0.7.0/src/tests/formatter.c
--- libgrss-0.7.0.orig/src/tests/formatter.c	2015-07-18 15:22:27.000000000 -0500
+++ libgrss-0.7.0/src/tests/formatter.c	2019-04-09 23:50:47.141354039 -0500
@@ -66,6 +66,9 @@ test_format_atom ()
 
 	formatter = grss_feed_atom_formatter_new ();
 	do_the_job (GRSS_FEED_FORMATTER (formatter));
+
+   grss_feed_formatter_reset (GRSS_FEED_FORMATTER (formatter));
+   g_object_unref (formatter);
 }
 
 static void
@@ -75,6 +78,9 @@ test_format_rss ()
 
 	formatter = grss_feed_rss_formatter_new ();
 	do_the_job (GRSS_FEED_FORMATTER (formatter));
+
+   grss_feed_formatter_reset (GRSS_FEED_FORMATTER (formatter));
+   g_object_unref (formatter);
 }
 
 int
diff -Naurp libgrss-0.7.0.orig/src/utils.c libgrss-0.7.0/src/utils.c
--- libgrss-0.7.0.orig/src/utils.c	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/utils.c	2019-04-10 00:33:27.328014093 -0500
@@ -559,7 +559,7 @@ detect_internet_address ()
 		return NULL;
 
 	sockfd = socket (AF_INET, SOCK_DGRAM, 0);
-	if (!sockfd)
+	if (sockfd < 0)
 		return NULL;
 
 	if (connect (sockfd, (struct sockaddr*) &serv_add, sizeof (serv_add)) == -1) {
diff -Naurp libgrss-0.7.0.orig/src/utils.h libgrss-0.7.0/src/utils.h
--- libgrss-0.7.0.orig/src/utils.h	2015-07-15 15:59:07.000000000 -0500
+++ libgrss-0.7.0/src/utils.h	2019-04-10 00:05:27.316424768 -0500
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/types.h>
+#include <sys/socket.h>
 #include <sys/stat.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
