summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2017-01-26 14:58:06 +0100
committerOndrej Holy <oholy@redhat.com>2017-01-26 16:00:11 +0100
commit32213bcb7d50e8af2ccd2bf1dbf98b15ff41520a (patch)
tree3a8e2496cbe942c3c063d781c167869cbc24e83b
parent1ccf7766efc57d9784e5e0b3cba33f5446052d24 (diff)
downloadgvfs-32213bcb7d50e8af2ccd2bf1dbf98b15ff41520a.tar.gz
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
-rw-r--r--daemon/gvfsbackendmtp.c11
-rw-r--r--daemon/gvfsbackendmtp.h1
2 files changed, 6 insertions, 6 deletions
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index dddc4d56..0b67c408 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 54200c4c..ad570675 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;