From 73ed731cc2725f5f9fab0e3bbde3cd276cc2de57 Mon Sep 17 00:00:00 2001 From: Jens Granseuer Date: Sat, 3 Nov 2007 10:57:05 +0000 Subject: [PATCH] be more careful when reading background information from GConf and make 2007-11-03 Jens Granseuer * appearance-desktop.c: (wp_color_changed), (wp_props_wp_set): * gnome-wp-item.c: (gnome_wp_item_new), (gnome_wp_item_free), (gnome_wp_item_dup): * gnome-wp-item.h: * gnome-wp-xml.c: (gnome_wp_xml_load_xml), (gnome_wp_xml_save_list): be more careful when reading background information from GConf and make sure we don't choke on NULL values later on (bug #492903) svn path=/trunk/; revision=8249 --- capplets/appearance/ChangeLog | 10 +++++ capplets/appearance/appearance-desktop.c | 30 ++++++------- capplets/appearance/gnome-wp-item.c | 54 ++++++++++++------------ capplets/appearance/gnome-wp-item.h | 2 - capplets/appearance/gnome-wp-xml.c | 44 ++++++++++--------- 5 files changed, 78 insertions(+), 62 deletions(-) diff --git a/capplets/appearance/ChangeLog b/capplets/appearance/ChangeLog index eb1fa0279..4d614f4ed 100644 --- a/capplets/appearance/ChangeLog +++ b/capplets/appearance/ChangeLog @@ -1,3 +1,13 @@ +2007-11-03 Jens Granseuer + + * appearance-desktop.c: (wp_color_changed), (wp_props_wp_set): + * gnome-wp-item.c: (gnome_wp_item_new), (gnome_wp_item_free), + (gnome_wp_item_dup): + * gnome-wp-item.h: + * gnome-wp-xml.c: (gnome_wp_xml_load_xml), (gnome_wp_xml_save_list): + be more careful when reading background information from GConf and make + sure we don't choke on NULL values later on (bug #492903) + 2007-11-01 Jens Granseuer Patch by: Joel Pfaff diff --git a/capplets/appearance/appearance-desktop.c b/capplets/appearance/appearance-desktop.c index aff8cba47..c0b0c58ae 100644 --- a/capplets/appearance/appearance-desktop.c +++ b/capplets/appearance/appearance-desktop.c @@ -401,24 +401,19 @@ wp_color_changed (AppearanceData *data, if (item == NULL) return; - g_free (item->pri_color); - gtk_color_button_get_color (GTK_COLOR_BUTTON (data->wp_pcpicker), item->pcolor); - - item->pri_color = gdk_color_to_string (item->pcolor); - - g_free (item->sec_color); - gtk_color_button_get_color (GTK_COLOR_BUTTON (data->wp_scpicker), item->scolor); - item->sec_color = gdk_color_to_string (item->scolor); - if (update) { - gconf_client_set_string (data->client, WP_PCOLOR_KEY, - item->pri_color, NULL); - gconf_client_set_string (data->client, WP_SCOLOR_KEY, - item->sec_color, NULL); + gchar *pcolor, *scolor; + + pcolor = gdk_color_to_string (item->pcolor); + scolor = gdk_color_to_string (item->scolor); + gconf_client_set_string (data->client, WP_PCOLOR_KEY, pcolor, NULL); + gconf_client_set_string (data->client, WP_SCOLOR_KEY, scolor, NULL); + g_free (pcolor); + g_free (scolor); } wp_shade_type_changed (NULL, data); @@ -583,6 +578,7 @@ static gboolean wp_props_wp_set (AppearanceData *data, GnomeWPItem *item) { GConfChangeSet *cs; + gchar *pcolor, *scolor; cs = gconf_change_set_new (); @@ -612,8 +608,12 @@ wp_props_wp_set (AppearanceData *data, GnomeWPItem *item) gconf_change_set_set_string (cs, WP_SHADING_KEY, item->shade_type); - gconf_change_set_set_string (cs, WP_PCOLOR_KEY, item->pri_color); - gconf_change_set_set_string (cs, WP_SCOLOR_KEY, item->sec_color); + pcolor = gdk_color_to_string (item->pcolor); + scolor = gdk_color_to_string (item->scolor); + gconf_change_set_set_string (cs, WP_PCOLOR_KEY, pcolor); + gconf_change_set_set_string (cs, WP_SCOLOR_KEY, scolor); + g_free (pcolor); + g_free (scolor); gconf_client_commit_change_set (data->client, cs, TRUE, NULL); diff --git a/capplets/appearance/gnome-wp-item.c b/capplets/appearance/gnome-wp-item.c index 3c095d1dd..1fd7a2c59 100644 --- a/capplets/appearance/gnome-wp-item.c +++ b/capplets/appearance/gnome-wp-item.c @@ -33,7 +33,8 @@ GnomeWPItem * gnome_wp_item_new (const gchar * filename, GHashTable * wallpapers, GnomeThumbnailFactory * thumbnails) { GnomeWPItem * item = NULL; - GdkColor color1, color2; + GdkColor color1 = { 0, 0, 0, 0 }, color2 = { 0, 0, 0, 0 }; + gchar * col_str; GConfClient * client; client = gconf_client_get_default (); @@ -44,18 +45,8 @@ GnomeWPItem * gnome_wp_item_new (const gchar * filename, item->fileinfo = gnome_wp_info_new (item->filename, thumbnails); - item->shade_type = gconf_client_get_string (client, WP_SHADING_KEY, NULL); - item->pri_color = gconf_client_get_string (client, WP_PCOLOR_KEY, NULL); - item->sec_color = gconf_client_get_string (client, WP_SCOLOR_KEY, NULL); - - gdk_color_parse (item->pri_color, &color1); - gdk_color_parse (item->sec_color, &color2); - - item->pcolor = gdk_color_copy (&color1); - item->scolor = gdk_color_copy (&color2); - if (item->fileinfo != NULL && - !strncmp (item->fileinfo->mime_type, "image/", strlen ("image/"))) { + !strcmp (item->fileinfo->mime_type, "image/")) { if (item->name == NULL) { if (g_utf8_validate (item->fileinfo->name, -1, NULL)) item->name = g_strdup (item->fileinfo->name); @@ -63,11 +54,32 @@ GnomeWPItem * gnome_wp_item_new (const gchar * filename, item->name = g_filename_to_utf8 (item->fileinfo->name, -1, NULL, NULL, NULL); } - item->options = gconf_client_get_string (client, WP_OPTIONS_KEY, NULL); - if (!strcmp (item->options, "none")) { + item->options = gconf_client_get_string (client, WP_OPTIONS_KEY, NULL); + if (item->options == NULL || !strcmp (item->options, "none")) { + g_free (item->options); item->options = g_strdup ("scaled"); } + + item->shade_type = gconf_client_get_string (client, WP_SHADING_KEY, NULL); + if (item->shade_type == NULL) + item->shade_type = g_strdup ("solid"); + + col_str = gconf_client_get_string (client, WP_PCOLOR_KEY, NULL); + if (col_str != NULL) { + gdk_color_parse (col_str, &color1); + g_free (col_str); + } + + col_str = gconf_client_get_string (client, WP_SCOLOR_KEY, NULL); + if (col_str != NULL) { + gdk_color_parse (col_str, &color2); + g_free (col_str); + } + + item->pcolor = gdk_color_copy (&color1); + item->scolor = gdk_color_copy (&color2); + gnome_wp_item_update_description (item); g_hash_table_insert (wallpapers, item->filename, item); @@ -92,9 +104,6 @@ void gnome_wp_item_free (GnomeWPItem * item) { g_free (item->options); g_free (item->shade_type); - g_free (item->pri_color); - g_free (item->sec_color); - if (item->pcolor != NULL) gdk_color_free (item->pcolor); @@ -111,7 +120,6 @@ void gnome_wp_item_free (GnomeWPItem * item) { GnomeWPItem * gnome_wp_item_dup (GnomeWPItem * item) { GnomeWPItem * new_item; - GdkColor color1, color2; if (item == NULL) { return NULL; @@ -125,14 +133,8 @@ GnomeWPItem * gnome_wp_item_dup (GnomeWPItem * item) { new_item->options = g_strdup (item->options); new_item->shade_type = g_strdup (item->shade_type); - new_item->pri_color = g_strdup (item->pri_color); - new_item->sec_color = g_strdup (item->sec_color); - - gdk_color_parse (item->pri_color, &color1); - gdk_color_parse (item->sec_color, &color2); - - item->pcolor = gdk_color_copy (&color1); - item->scolor = gdk_color_copy (&color2); + new_item->pcolor = gdk_color_copy (item->pcolor); + new_item->scolor = gdk_color_copy (item->scolor); new_item->fileinfo = gnome_wp_info_dup (item->fileinfo); new_item->uriinfo = gnome_wp_info_dup (item->uriinfo); diff --git a/capplets/appearance/gnome-wp-item.h b/capplets/appearance/gnome-wp-item.h index dcdb886ea..776960fa3 100644 --- a/capplets/appearance/gnome-wp-item.h +++ b/capplets/appearance/gnome-wp-item.h @@ -36,8 +36,6 @@ struct _GnomeWPItem { gchar * description; gchar * options; gchar * shade_type; - gchar * pri_color; - gchar * sec_color; /* Where the Item is in the List */ GtkTreeRowReference * rowref; diff --git a/capplets/appearance/gnome-wp-xml.c b/capplets/appearance/gnome-wp-xml.c index dbb9d121d..36f1aefe2 100644 --- a/capplets/appearance/gnome-wp-xml.c +++ b/capplets/appearance/gnome-wp-xml.c @@ -118,6 +118,7 @@ static void gnome_wp_xml_load_xml (AppearanceData *data, for (list = root->children; list != NULL; list = list->next) { if (!strcmp ((gchar *)list->name, "wallpaper")) { GnomeWPItem * wp; + gchar *pcolor = NULL, *scolor = NULL; wp = g_new0 (GnomeWPItem, 1); @@ -172,11 +173,11 @@ static void gnome_wp_xml_load_xml (AppearanceData *data, } } else if (!strcmp ((gchar *)wpa->name, "pcolor")) { if (wpa->last != NULL) { - wp->pri_color = g_strdup (g_strstrip ((gchar *)wpa->last->content)); + pcolor = g_strdup (g_strstrip ((gchar *)wpa->last->content)); } } else if (!strcmp ((gchar *)wpa->name, "scolor")) { if (wpa->last != NULL) { - wp->sec_color = g_strdup (g_strstrip ((gchar *)wpa->last->content)); + scolor = g_strdup (g_strstrip ((gchar *)wpa->last->content)); } } else if (!strcmp ((gchar *)wpa->name, "text")) { /* Do nothing here, libxml2 is being weird */ @@ -186,15 +187,12 @@ static void gnome_wp_xml_load_xml (AppearanceData *data, } /* Make sure we don't already have this one and that filename exists */ - if (wp->filename != NULL) { - item = g_hash_table_lookup (data->wp_hash, wp->filename); + if (wp->filename == NULL || + g_hash_table_lookup (data->wp_hash, wp->filename) != NULL) { - if (item != NULL) { - gnome_wp_item_free (wp); - continue; - } - } else { gnome_wp_item_free (wp); + g_free (pcolor); + g_free (scolor); continue; } @@ -203,16 +201,18 @@ static void gnome_wp_xml_load_xml (AppearanceData *data, wp->shade_type = gconf_client_get_string (data->client, WP_SHADING_KEY, NULL); } - if (wp->pri_color == NULL) { - wp->pri_color = gconf_client_get_string (data->client, - WP_PCOLOR_KEY, NULL); + if (pcolor == NULL) { + pcolor = gconf_client_get_string (data->client, + WP_PCOLOR_KEY, NULL); } - if (wp->sec_color == NULL) { - wp->sec_color = gconf_client_get_string (data->client, - WP_SCOLOR_KEY, NULL); + if (scolor == NULL) { + scolor = gconf_client_get_string (data->client, + WP_SCOLOR_KEY, NULL); } - gdk_color_parse (wp->pri_color, &color1); - gdk_color_parse (wp->sec_color, &color2); + gdk_color_parse (pcolor, &color1); + gdk_color_parse (scolor, &color2); + g_free (pcolor); + g_free (scolor); wp->pcolor = gdk_color_copy (&color1); wp->scolor = gdk_color_copy (&color2); @@ -379,6 +379,7 @@ void gnome_wp_xml_save_list (AppearanceData *data) { GnomeWPItem * wpitem = list->data; const char * none = "(none)"; gchar * filename; + gchar * pcolor, * scolor; if (!strcmp (wpitem->filename, none) || (g_utf8_validate (wpitem->filename, -1, NULL) && @@ -387,14 +388,19 @@ void gnome_wp_xml_save_list (AppearanceData *data) { else filename = g_filename_to_utf8 (wpitem->filename, -1, NULL, NULL, NULL); + pcolor = gdk_color_to_string (wpitem->pcolor); + scolor = gdk_color_to_string (wpitem->scolor); + wallpaper = xmlNewChild (root, NULL, (xmlChar *)"wallpaper", NULL); gnome_wp_xml_set_bool (wallpaper, (xmlChar *)"deleted", wpitem->deleted); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"name", (xmlChar *)wpitem->name); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"filename", (xmlChar *)filename); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"options", (xmlChar *)wpitem->options); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"shade_type", (xmlChar *)wpitem->shade_type); - item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"pcolor", (xmlChar *)wpitem->pri_color); - item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"scolor", (xmlChar *)wpitem->sec_color); + item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"pcolor", (xmlChar *)pcolor); + item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"scolor", (xmlChar *)scolor); + g_free (pcolor); + g_free (scolor); g_free (filename); list = g_slist_delete_link (list, list);