[evolution-rss] do not crash on invalid opml files
- From: Lucian Langa <lucilanga src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution-rss] do not crash on invalid opml files
- Date: Sat, 5 Dec 2009 13:20:09 +0000 (UTC)
commit 8701aaeee26292fcb36abbc77231eb51595196c1
Author: Lucian Langa <lucilanga gnome org>
Date: Sat Dec 5 15:20:00 2009 +0200
do not crash on invalid opml files
src/parser.c | 10 ++++--
src/rss-config-factory.c | 17 ++++++---
src/rss.c | 84 ++++++++++++++++++++++++++++++++++++----------
3 files changed, 85 insertions(+), 26 deletions(-)
---
diff --git a/src/parser.c b/src/parser.c
index 50cd35f..c0dcddc 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1020,7 +1020,7 @@ parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date)
CF->dcdate = g_strdup(d2);
CF->website = g_strdup(link);
CF->encl = g_strdup(encl);
- CF->comments = g_strdup(comments);
+ CF->comments = g_strdup(comments);
CF->feed_fname = g_strdup(feed_name); //feed file name
CF->feed_uri = g_strdup(feed); //feed uri (uid!)
CF->category = category; //list of category feed is posted under
@@ -1075,9 +1075,13 @@ update_channel(RDF *r)
if (progress) {
gdouble fraction = (gdouble)i/item->len;
- gtk_progress_bar_set_fraction((GtkProgressBar *)progress, fraction);
+ gtk_progress_bar_set_fraction(
+ (GtkProgressBar *)progress,
+ fraction);
msg = g_strdup_printf("%2.0f%% done", fraction*100);
- gtk_progress_bar_set_text((GtkProgressBar *)progress, msg);
+ gtk_progress_bar_set_text(
+ (GtkProgressBar *)progress,
+ msg);
g_free(msg);
}
diff --git a/src/rss-config-factory.c b/src/rss-config-factory.c
index 3f00628..554cea0 100644
--- a/src/rss-config-factory.c
+++ b/src/rss-config-factory.c
@@ -689,6 +689,7 @@ gboolean
store_redraw(GtkTreeView *data)
{
GtkTreeModel *model;
+
g_return_val_if_fail(data, FALSE);
g_return_val_if_fail(GTK_WIDGET_REALIZED(data), FALSE);
@@ -1409,8 +1410,9 @@ import_opml(gchar *file)
if (type == 0) {
gint size = 0;
gchar *base = NULL, *root = NULL, *last = NULL;
- gchar *rssprefix = NULL, *rssurl = NULL, *rsstitle = NULL;
+ gchar *rssprefix = NULL;
while (src) {
+ gchar *rssurl = NULL, *rsstitle = NULL;
if (rf->cancel) {
if (src) xmlFree(src);
rf->cancel = 0;
@@ -1422,8 +1424,9 @@ import_opml(gchar *file)
while (src && !src->next) {
src = src->parent;
g_print("<-");
- last = g_path_get_basename(root);
- if (last && strcmp(last, ".")) {
+ if (root
+ && (last = g_path_get_basename(root))
+ && strcmp(last, ".")) {
g_print("retract:%s\n", last);
size = strstr(root, last)-root-1;
tmp = root;
@@ -1455,8 +1458,11 @@ import_opml(gchar *file)
// we're insterested in rss/pie only
// we might just handle all variations of type= property
} else if (strcmp(prop, "link")) {
+ // && strcmp(prop, "vfolder")) {
rssprefix = root;
rssurl = (gchar *)xmlGetProp(src, (xmlChar *)"xmlUrl");
+ if (!rssurl)
+ goto fail;
rsstitle = (gchar *)xmlGetProp(src, (xmlChar *)"title");
gtk_label_set_text(GTK_LABEL(import_label), (gchar *)rsstitle);
#if GTK_VERSION >= 2006000
@@ -1466,11 +1472,12 @@ import_opml(gchar *file)
import_one_feed(rssurl, rsstitle, rssprefix);
if (rssurl) xmlFree(rssurl);
if (rsstitle) xmlFree(rsstitle);
- while (gtk_events_pending ())
+fail: while (gtk_events_pending ())
gtk_main_iteration ();
current++;
fr = ((current*100)/total);
- gtk_progress_bar_set_fraction((GtkProgressBar *)import_progress, fr/100);
+ if (fr < 100)
+ gtk_progress_bar_set_fraction((GtkProgressBar *)import_progress, fr/100);
what = g_strdup_printf(_("%2.0f%% done"), fr);
gtk_progress_bar_set_text((GtkProgressBar *)import_progress, what);
g_free(what);
diff --git a/src/rss.c b/src/rss.c
index 23971fc..b3d0d93 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -387,15 +387,26 @@ rss_error(gpointer key, gchar *name, gchar *error, gchar *emsg)
g_timeout_add_seconds(60, (GSourceFunc)gtk_widget_destroy, ed);
#if (EVOLUTION_VERSION >= 22900) //kb//
- em_utils_show_error_silent(ed);
- g_hash_table_insert(rf->error_hash, newkey, GINT_TO_POINTER(1));
+ em_utils_show_error_silent(ed);
+ g_hash_table_insert(
+ rf->error_hash,
+ newkey,
+ GINT_TO_POINTER(1));
#else
activity_handler = mail_component_peek_activity_handler (mail_component_peek());
#if (EVOLUTION_VERSION >= 22203)
- id = e_activity_handler_make_error (activity_handler, (char *)mail_component_peek(), E_LOG_ERROR, ed);
+ id = e_activity_handler_make_error (
+ activity_handler,
+ (char *)mail_component_peek(),
+ E_LOG_ERROR,
+ ed);
#else
- id = e_activity_handler_make_error (activity_handler, (char *)mail_component_peek(), (gchar *)msg, ed);
+ id = e_activity_handler_make_error (
+ activity_handler,
+ (char *)mail_component_peek(),
+ (gchar *)msg,
+ ed);
#endif
g_hash_table_insert(rf->error_hash, newkey, GINT_TO_POINTER(id));
#endif
@@ -1141,12 +1152,14 @@ void
rss_select_folder(gchar *folder_name)
{
#if EVOLUTION_VERSION >= 22900
- EMFolderTree *folder_tree;
+ EMFolderTree *folder_tree = NULL;
gchar *uri;
CamelStore *store;
CamelFolder *fold;
EShellSidebar *shell_sidebar;
+ g_return_if_fail(folder_name != NULL);
+
shell_sidebar = e_shell_view_get_shell_sidebar(rss_shell_view);
g_object_get (shell_sidebar, "folder-tree", &folder_tree, NULL);
store = rss_component_peek_local_store();
@@ -2961,7 +2974,13 @@ setup_feed(add_feed *feed)
goto add;
top: d(g_print("adding feed->feed_url:%s\n", feed->feed_url));
- content = fetch_blocking(feed->feed_url, NULL, post, textcb, rf, &err);
+ content = fetch_blocking(
+ feed->feed_url,
+ NULL,
+ post,
+ textcb,
+ rf,
+ &err);
if (err) {
g_print("setup_feed() -> err:%s\n", err->message);
tmpkey = gen_md5(feed->feed_url);
@@ -3064,7 +3083,11 @@ add:
GINT_TO_POINTER(feed->fetch_html));
if (feed->edit) {
- gchar *a = g_build_path("/", feed->prefix ? feed->prefix : "", feed->feed_name, NULL);
+ gchar *a = g_build_path(
+ "/",
+ feed->prefix ? feed->prefix : "",
+ feed->feed_name,
+ NULL);
gchar *b = g_build_path("/", r->title, NULL);
update_feed_folder(b, a, 0);
//r->title = feed->feed_name;
@@ -3073,7 +3096,10 @@ add:
}
if (rf->import && feed->prefix) {
- gchar *a = g_build_path("/", feed->prefix ? feed->prefix : "", feed->feed_name, NULL);
+ gchar *a = g_build_path(
+ "/", feed->prefix ? feed->prefix : "",
+ feed->feed_name,
+ NULL);
gchar *b = g_build_path("/", r->title, NULL);
update_feed_folder(b, a, 0);
g_free(a);
@@ -3083,7 +3109,10 @@ add:
if (feed->validate)
display_feed(r);
- real_name = g_strdup_printf("%s/%s", lookup_main_folder(), chn_name);
+ real_name = g_strdup_printf(
+ "%s/%s",
+ lookup_main_folder(),
+ lookup_feed_folder(chn_name));
rss_select_folder(real_name);
g_free(real_name);
@@ -3118,9 +3147,10 @@ add:
g_string_free(content, 1);
feed->feed_url = rssurl;
- if (g_hash_table_find(rf->hr,
- check_if_match,
- feed->feed_url)) {
+ if (g_hash_table_find(
+ rf->hr,
+ check_if_match,
+ feed->feed_url)) {
rss_error(NULL, NULL, _("Error adding feed."),
_("Feed already exists!"));
goto out;
@@ -3141,7 +3171,10 @@ void
update_sr_message(void)
{
if (flabel && farticle) {
- gchar *fmsg = g_strdup_printf(_("Getting message %d of %d"), farticle, ftotal);
+ gchar *fmsg = g_strdup_printf(
+ _("Getting message %d of %d"),
+ farticle,
+ ftotal);
gtk_label_set_text (GTK_LABEL (flabel), fmsg);
g_free(fmsg);
}
@@ -4559,6 +4592,7 @@ check_folders(void)
camel_store_rename_folder(store, OLD_FEEDS_FOLDER, lookup_main_folder(), NULL);
} else if (mail_folder == NULL) {
camel_store_create_folder (store, NULL, lookup_main_folder(), &ex);
+ return;
}
camel_object_unref (mail_folder);
}
@@ -5111,13 +5145,24 @@ create_mail(create_feed *CF)
}
time = camel_mime_message_get_date (new, NULL) ;
time_str = asctime(gmtime(&time));
- buf = g_strdup_printf("from %s by localhost via evolution-rss-%s with libsoup-%d; %s\r\n", "RSS", VERSION, LIBSOUP_VERSION, time_str);
+ buf = g_strdup_printf(
+ "from %s by localhost via evolution-rss-%s with libsoup-%d; %s\r\n",
+ "RSS",
+ VERSION,
+ LIBSOUP_VERSION,
+ time_str);
camel_medium_set_header(CAMEL_MEDIUM(new), "Received", buf);
camel_medium_set_header(CAMEL_MEDIUM(new), "Website", CF->website);
camel_medium_set_header(CAMEL_MEDIUM(new), "RSS-ID", CF->feedid);
- camel_medium_set_header(CAMEL_MEDIUM(new), "X-evolution-rss-feed-ID", g_strstrip(CF->feed_uri));
+ camel_medium_set_header(
+ CAMEL_MEDIUM(new),
+ "X-evolution-rss-feed-ID",
+ g_strstrip(CF->feed_uri));
if (CF->comments)
- camel_medium_set_header(CAMEL_MEDIUM(new), "X-evolution-rss-comments", CF->comments);
+ camel_medium_set_header(
+ CAMEL_MEDIUM(new),
+ "X-evolution-rss-comments",
+ CF->comments);
if (CF->category) {
cats = g_string_new(NULL);
for (p = (GList *)CF->category; p != NULL; p=p->next) {
@@ -5126,7 +5171,10 @@ create_mail(create_feed *CF)
else
g_string_append_printf(cats, "%s", (char *)p->data);
}
- camel_medium_set_header(CAMEL_MEDIUM(new), "X-evolution-rss-category", cats->str);
+ camel_medium_set_header(
+ CAMEL_MEDIUM(new),
+ "X-evolution-rss-category",
+ cats->str);
g_string_free(cats, TRUE);
}
rtext = camel_data_wrapper_new ();
@@ -5316,7 +5364,7 @@ g_print("siz:%d\n", (int)(sizeof(msg)));
}
free_cf(user_data);
//g_free(msg->response_body->data);
- g_object_unref(msg);
+ //g_object_unref(msg);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]