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