Hello community,
here is the log from the commit of package libgnomeui
checked in at Thu Jun 5 17:40:56 CEST 2008.
--------
--- GNOME/libgnomeui/libgnomeui.changes 2008-04-10 12:58:41.000000000 +0200
+++ /mounts/work_src_done/STABLE/libgnomeui/libgnomeui.changes 2008-06-04 20:54:45.725355000 +0200
@@ -1,0 +2,8 @@
+Wed Jun 4 21:01:17 CEST 2008 - federico@novell.com
+
+- Added libgnomeui-bnc396681-gio-async-crash.diff to fix
+ https://bugzilla.novell.com/show_bug.cgi?id=396681 - The file
+ chooser could crash if asynchronous callbacks were called after the
+ file chooser itself was destroyed.
+
+-------------------------------------------------------------------
New:
----
libgnomeui-bnc396681-gio-async-crash.diff
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libgnomeui.spec ++++++
--- /var/tmp/diff_new_pack.I24795/_old 2008-06-05 17:40:11.000000000 +0200
+++ /var/tmp/diff_new_pack.I24795/_new 2008-06-05 17:40:11.000000000 +0200
@@ -18,9 +18,11 @@
AutoReqProv: on
Requires: gnome-icon-theme shared-mime-info
Version: 2.22.1
-Release: 2
+Release: 21
Summary: The GNOME User Interface Library
Source: %{name}-%{version}.tar.bz2
+# PATCH-FIX-UPSTREAM libgnomeui-bnc396681-gio-async-crash.diff bnc396681 federico@novell.com - Fix crasher in GtkFileSystemGio
+Patch1: libgnomeui-bnc396681-gio-async-crash.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: %{name}-lang = %{version}
@@ -79,6 +81,7 @@
%lang_package
%prep
%setup -q
+%patch1 -p1
%build
autoreconf -f -i
@@ -126,6 +129,11 @@
%{_datadir}/gtk-doc/html/libgnomeui
%changelog
+* Wed Jun 04 2008 federico@novell.com
+- Added libgnomeui-bnc396681-gio-async-crash.diff to fix
+ https://bugzilla.novell.com/show_bug.cgi?id=396681 - The file
+ chooser could crash if asynchronous callbacks were called after the
+ file chooser itself was destroyed.
* Thu Apr 10 2008 ro@suse.de
- added baselibs.conf file to build xxbit packages
for multilib support
++++++ libgnomeui-bnc396681-gio-async-crash.diff ++++++
2008-06-03 Federico Mena Quintero
Fix https://bugzilla.novell.com/show_bug.cgi?id=396681 - crash
when an async callback gets called after the GtkFileSystemGio has
been freed.
* file-chooser/gtkfilesystemgio.c (new_handle): New function to
avoid duplicated code.
(gtk_file_system_gio_get_folder): Use new_handle().
(gtk_file_system_gio_get_info): Likewise.
(gtk_file_system_gio_create_folder): Likewise.
(gtk_file_system_gio_volume_mount): Likewise.
(gtk_file_system_gio_cancel_operation): Turn on the base
handle->cancelled. The file chooser uses this flag from its own
callbacks.
(enumerate_children_callback): Don't try to access the handle's
file_system if the handle was cacelled (the file_system may have
been freed in that case).
(enumerate_children_callback): Free the GError.
(query_info_callback): Ensure we don't operate on a cancelled handle.
(query_info_callback): Free the GError.
(mount_async_callback): Free the GError.
diff --git a/file-chooser/gtkfilesystemgio.c b/file-chooser/gtkfilesystemgio.c
index 425582e..9eb4c0a 100644
--- a/file-chooser/gtkfilesystemgio.c
+++ b/file-chooser/gtkfilesystemgio.c
@@ -523,6 +523,22 @@ gtk_file_system_handle_gio_finalize (GObject *object)
G_OBJECT_CLASS (gtk_file_system_handle_gio_parent_class)->finalize (object);
}
+static GtkFileSystemHandleGio *
+new_handle (GtkFileSystem *file_system,
+ gpointer callback,
+ gpointer data)
+{
+ GtkFileSystemHandleGio *handle;
+
+ handle = g_object_new (GTK_TYPE_FILE_SYSTEM_HANDLE_GIO, NULL);
+ GTK_FILE_SYSTEM_HANDLE (handle)->file_system = file_system;
+ handle->cancellable = g_cancellable_new ();
+ handle->callback = callback;
+ handle->data = data;
+
+ return handle;
+}
+
/* GtkFileSystem interface implementation */
static void
gtk_file_system_gio_iface_init (GtkFileSystemIface *iface)
@@ -733,7 +749,6 @@ enumerate_children_callback (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
- GtkFileSystemGio *file_system;
GtkFileSystemHandleGio *handle;
GtkFileFolderGio *folder = NULL;
GFileEnumerator *enumerator;
@@ -742,40 +757,50 @@ enumerate_children_callback (GObject *source_object,
file = G_FILE (source_object);
handle = GTK_FILE_SYSTEM_HANDLE_GIO (user_data);
- file_system = GTK_FILE_SYSTEM_GIO (GTK_FILE_SYSTEM_HANDLE (handle)->file_system);
enumerator = g_file_enumerate_children_finish (file, result, &error);
if (enumerator)
{
- folder = g_object_new (GTK_TYPE_FILE_FOLDER_GIO, NULL);
- folder->cancellable = g_object_ref (file_system->cancellable);
- folder->parent_file = g_object_ref (file);
- folder->children = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) g_object_unref);
- folder->finished_loading = FALSE;
+ if (!GTK_FILE_SYSTEM_HANDLE (handle)->cancelled)
+ {
+ GtkFileSystemGio *file_system;
- folder->directory_monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, &error);
+ file_system = GTK_FILE_SYSTEM_GIO (GTK_FILE_SYSTEM_HANDLE (handle)->file_system);
+
+ folder = g_object_new (GTK_TYPE_FILE_FOLDER_GIO, NULL);
+ folder->cancellable = g_object_ref (file_system->cancellable);
+ folder->parent_file = g_object_ref (file);
+ folder->children = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_object_unref);
+ folder->finished_loading = FALSE;
+
+ folder->directory_monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, &error);
+
+ if (error)
+ g_warning (error->message);
+ else
+ g_signal_connect (folder->directory_monitor, "changed",
+ G_CALLBACK (directory_monitor_changed), folder);
+
+ g_file_enumerator_next_files_async (enumerator, FILES_PER_QUERY,
+ G_PRIORITY_DEFAULT,
+ folder->cancellable,
+ enumerator_files_callback,
+ g_object_ref (folder));
+ }
- if (error)
- g_warning (error->message);
- else
- g_signal_connect (folder->directory_monitor, "changed",
- G_CALLBACK (directory_monitor_changed), folder);
-
- g_file_enumerator_next_files_async (enumerator, FILES_PER_QUERY,
- G_PRIORITY_DEFAULT,
- folder->cancellable,
- enumerator_files_callback,
- g_object_ref (folder));
g_object_unref (enumerator);
}
gdk_threads_enter ();
((GtkFileSystemGetFolderCallback) handle->callback) (GTK_FILE_SYSTEM_HANDLE (handle),
- GTK_FILE_FOLDER (folder),
+ folder ? GTK_FILE_FOLDER (folder) : NULL,
error, handle->data);
gdk_threads_leave ();
+
+ if (error)
+ g_error_free (error);
}
static GtkFileSystemHandle *
@@ -794,11 +819,7 @@ gtk_file_system_gio_get_folder (GtkFileSystem *file_system,
g_return_val_if_fail (file != NULL, NULL);
- handle = g_object_new (GTK_TYPE_FILE_SYSTEM_HANDLE_GIO, NULL);
- GTK_FILE_SYSTEM_HANDLE (handle)->file_system = file_system;
- handle->cancellable = g_cancellable_new ();
- handle->callback = callback;
- handle->data = data;
+ handle = new_handle (file_system, callback, data);
g_file_enumerate_children_async (file, "standard,time,thumbnail::*", 0, 0,
handle->cancellable,
@@ -959,6 +980,9 @@ mount_async_callback (GObject *source_object,
((GtkFileSystemGetInfoCallback) handle->callback) (GTK_FILE_SYSTEM_HANDLE (handle),
NULL, error, handle->data);
gdk_threads_leave ();
+
+ if (error)
+ g_error_free (error);
}
}
@@ -979,13 +1003,17 @@ query_info_callback (GObject *source_object,
handle = GTK_FILE_SYSTEM_HANDLE_GIO (user_data);
file_info = g_file_query_info_finish (file, result, &error);
+ if (GTK_FILE_SYSTEM_HANDLE (handle)->cancelled)
+ goto out;
+
if (file_info)
{
info = translate_file_info (file, file_info);
- g_object_unref (file_info);
}
else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED) && !handle->tried_mount)
{
+ g_assert (!GTK_FILE_SYSTEM_HANDLE (handle)->cancelled);
+
/* If it's not mounted, try to mount it ourselves */
g_error_free (error);
handle->tried_mount = TRUE;
@@ -996,13 +1024,21 @@ query_info_callback (GObject *source_object,
return;
}
+ out:
+
gdk_threads_enter ();
((GtkFileSystemGetInfoCallback) handle->callback) (GTK_FILE_SYSTEM_HANDLE (handle),
info, error, handle->data);
gdk_threads_leave ();
+ if (error)
+ g_error_free (error);
+
if (info)
gtk_file_info_free (info);
+
+ if (file_info)
+ g_object_unref (file_info);
}
static GtkFileSystemHandle *
@@ -1021,11 +1057,7 @@ gtk_file_system_gio_get_info (GtkFileSystem *file_system,
g_return_val_if_fail (file != NULL, NULL);
- handle = g_object_new (GTK_TYPE_FILE_SYSTEM_HANDLE_GIO, NULL);
- GTK_FILE_SYSTEM_HANDLE (handle)->file_system = file_system;
- handle->cancellable = g_cancellable_new ();
- handle->callback = callback;
- handle->data = data;
+ handle = new_handle (file_system, callback, data);
handle->tried_mount = FALSE;
g_file_query_info_async (file, "standard,time,thumbnail::*", 0, 0,
@@ -1080,11 +1112,7 @@ gtk_file_system_gio_create_folder (GtkFileSystem *file_syste
/* FIXME: make_directory() doesn't seem to have async version */
- handle = g_object_new (GTK_TYPE_FILE_SYSTEM_HANDLE_GIO, NULL);
- GTK_FILE_SYSTEM_HANDLE (handle)->file_system = file_system;
- handle->cancellable = g_cancellable_new ();
- handle->callback = callback;
- handle->data = data;
+ handle = new_handle (file_system, callback, data);
idle_data = g_slice_new (CreateFolderData);
idle_data->path = gtk_file_path_copy (path);
@@ -1109,6 +1137,7 @@ gtk_file_system_gio_cancel_operation (GtkFileSystemHandle *handle)
g_cancellable_cancel (handle_gio->cancellable);
g_object_unref (handle_gio->cancellable);
handle_gio->cancellable = NULL;
+ handle->cancelled = TRUE;
}
if (handle_gio->source_id)
@@ -1116,6 +1145,12 @@ gtk_file_system_gio_cancel_operation (GtkFileSystemHandle *handle)
/* This is only for functions without async option */
g_source_remove (handle_gio->source_id);
handle_gio->source_id = 0;
+ handle->cancelled = TRUE;
+
+ /* FIXME: the user's callback *still* needs to be called so that we can
+ * notify it that the operation was cancelled. However, by removing the
+ * idle handler as above, the callback won't get called!
+ */
}
}
@@ -1256,11 +1291,7 @@ gtk_file_system_gio_volume_mount (GtkFileSystem *file_system,
DEBUG ("volume_mount");
- handle = g_object_new (GTK_TYPE_FILE_SYSTEM_HANDLE_GIO, NULL);
- GTK_FILE_SYSTEM_HANDLE (handle)->file_system = file_system;
- handle->cancellable = g_cancellable_new ();
- handle->callback = callback;
- handle->data = data;
+ handle = new_handle (file_system, callback, data);
if (g_type_is_a (G_OBJECT_TYPE (file_system_volume), G_TYPE_DRIVE))
{
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org