[brasero] Fix #589870 – nautilus crashed with SIGSEGV in g_hash_table_lookup()



commit 44a2dda57f71d9c0463f225f5730787e06f16e97
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date:   Mon Aug 3 13:54:40 2009 +0200

    Fix #589870 â?? nautilus crashed with SIGSEGV in g_hash_table_lookup()
    While returning our results after an asynchronous search, make sure that we ref the object to keep it around as long as we need it.
    Also don't assume that BraseroTrackDataCfg and its "child" object BraseroDataProject life span are the same so disconnect all signals.

 libbrasero-burn/brasero-track-data-cfg.c |  105 +++++++++++++++++++++++-------
 libbrasero-utils/brasero-io.c            |    9 ++-
 2 files changed, 90 insertions(+), 24 deletions(-)
---
diff --git a/libbrasero-burn/brasero-track-data-cfg.c b/libbrasero-burn/brasero-track-data-cfg.c
index 69d3505..3e91a26 100644
--- a/libbrasero-burn/brasero-track-data-cfg.c
+++ b/libbrasero-burn/brasero-track-data-cfg.c
@@ -1754,29 +1754,6 @@ brasero_track_data_clean_autorun (BraseroTrackDataCfg *track)
 }
 
 static void
-brasero_track_data_cfg_finalize (GObject *object)
-{
-	BraseroTrackDataCfgPrivate *priv;
-
-	priv = BRASERO_TRACK_DATA_CFG_PRIVATE (object);
-
-	brasero_track_data_clean_autorun (BRASERO_TRACK_DATA_CFG (object));
-	brasero_track_data_cfg_clean_cache (BRASERO_TRACK_DATA_CFG (object));
-
-	if (priv->shown) {
-		g_slist_free (priv->shown);
-		priv->shown = NULL;
-	}
-
-	if (priv->tree) {
-		g_object_unref (priv->tree);
-		priv->tree = NULL;
-	}
-
-	G_OBJECT_CLASS (brasero_track_data_cfg_parent_class)->finalize (object);
-}
-
-static void
 brasero_track_data_cfg_iface_init (gpointer g_iface, gpointer data)
 {
 	GtkTreeModelIface *iface = g_iface;
@@ -3158,6 +3135,88 @@ brasero_track_data_cfg_init (BraseroTrackDataCfg *object)
 }
 
 static void
+brasero_track_data_cfg_finalize (GObject *object)
+{
+	BraseroTrackDataCfgPrivate *priv;
+
+	priv = BRASERO_TRACK_DATA_CFG_PRIVATE (object);
+
+	brasero_track_data_clean_autorun (BRASERO_TRACK_DATA_CFG (object));
+	brasero_track_data_cfg_clean_cache (BRASERO_TRACK_DATA_CFG (object));
+
+	if (priv->shown) {
+		g_slist_free (priv->shown);
+		priv->shown = NULL;
+	}
+
+	if (priv->tree) {
+		/* This object could outlive us just for some time
+		 * so we better remove all signals.
+		 * When an image URI is detected it can happen
+		 * that we'll be destroyed. */
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_node_added,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_node_changed,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_node_removed,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_node_reordered,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_size_changed_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_session_available_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_session_loaded_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_project_loaded,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_activity_changed,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_deep_directory,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_2G_file,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_unreadable_uri_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_unknown_uri_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_recursive_uri_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_image_uri_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_virtual_sibling_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_name_collision_cb,
+		                                      object);
+		g_signal_handlers_disconnect_by_func (priv->tree,
+		                                      brasero_track_data_cfg_joliet_rename_cb,
+		                                      object);
+
+		g_object_unref (priv->tree);
+		priv->tree = NULL;
+	}
+
+	G_OBJECT_CLASS (brasero_track_data_cfg_parent_class)->finalize (object);
+}
+
+static void
 brasero_track_data_cfg_class_init (BraseroTrackDataCfgClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
diff --git a/libbrasero-utils/brasero-io.c b/libbrasero-utils/brasero-io.c
index cfeb4d5..bd12861 100644
--- a/libbrasero-utils/brasero-io.c
+++ b/libbrasero-utils/brasero-io.c
@@ -364,6 +364,11 @@ brasero_io_return_result_idle (gpointer callback_data)
 		g_mutex_unlock (priv->lock);
 
 		data = result->callback_data;
+
+		/* This is to make sure the object lives
+		 * as long as we need it. */
+		g_object_ref (base->object);
+
 		if (result->uri || result->info || result->error)
 			result->base->callback (base->object,
 						result->error,
@@ -371,12 +376,14 @@ brasero_io_return_result_idle (gpointer callback_data)
 						result->info,
 						data? data->callback_data:NULL);
 
-		/* Else this is just to call destroy () for callback data */
+		/* call destroy () for callback data */
 		brasero_io_unref_result_callback_data (data,
 						       base->object,
 						       base->destroy,
 						       FALSE);
 
+		g_object_unref (base->object);
+
 		brasero_io_job_result_free (result);
 
 		g_mutex_lock (priv->lock);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]