[gvfs] mtp: Disconnect uevent handler immediately
- From: Ondrej Holy <oholy src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] mtp: Disconnect uevent handler immediately
- Date: Fri, 27 Jan 2017 07:21:22 +0000 (UTC)
commit 32213bcb7d50e8af2ccd2bf1dbf98b15ff41520a
Author: Ondrej Holy <oholy redhat com>
Date: Thu Jan 26 14:58:06 2017 +0100
mtp: Disconnect uevent handler immediately
Uevent handler with "remove" action may be called multiple times,
which causes that g_vfs_backend_force_unmount is called several
times, which may lead to segfault. Disconnect the uevent handler
immediately after g_vfs_backend_force_unmount call.
https://bugzilla.gnome.org/show_bug.cgi?id=777794
daemon/gvfsbackendmtp.c | 11 ++++++-----
daemon/gvfsbackendmtp.h | 1 -
2 files changed, 6 insertions(+), 6 deletions(-)
---
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index dddc4d5..0b67c40 100644
--- a/daemon/gvfsbackendmtp.c
+++ b/daemon/gvfsbackendmtp.c
@@ -603,6 +603,8 @@ on_uevent (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer use
op_backend->force_unmounted = TRUE;
g_atomic_int_set (&op_backend->unmount_started, TRUE);
g_vfs_backend_force_unmount ((GVfsBackend*)op_backend);
+
+ g_signal_handlers_disconnect_by_func (op_backend->gudev_client, on_uevent, op_backend);
}
g_debug ("(I) on_uevent done.\n");
@@ -912,9 +914,7 @@ do_mount (GVfsBackend *backend,
op_backend->volume_symbolic_icon = g_vfs_get_volume_symbolic_icon (device);
g_object_unref (device);
- op_backend->on_uevent_id =
- g_signal_connect_object (op_backend->gudev_client, "uevent",
- G_CALLBACK (on_uevent), op_backend, 0);
+ g_signal_connect (op_backend->gudev_client, "uevent", G_CALLBACK (on_uevent), op_backend);
op_backend->file_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
@@ -994,8 +994,9 @@ do_unmount (GVfsBackend *backend, GVfsJobUnmount *job,
g_hash_table_unref (op_backend->file_cache);
g_source_remove (op_backend->hb_id);
- g_signal_handler_disconnect (op_backend->gudev_client,
- op_backend->on_uevent_id);
+
+ g_signal_handlers_disconnect_by_func (op_backend->gudev_client, on_uevent, op_backend);
+
g_object_unref (op_backend->gudev_client);
g_clear_pointer (&op_backend->dev_path, g_free);
g_clear_pointer (&op_backend->volume_name, g_free);
diff --git a/daemon/gvfsbackendmtp.h b/daemon/gvfsbackendmtp.h
index 54200c4..ad57067 100644
--- a/daemon/gvfsbackendmtp.h
+++ b/daemon/gvfsbackendmtp.h
@@ -46,7 +46,6 @@ struct _GVfsBackendMtp
#ifdef HAVE_GUDEV
GUdevClient *gudev_client;
- gulong on_uevent_id;
#endif
GMutex mutex;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]