diff options
author | Ondrej Holy <oholy@redhat.com> | 2017-01-26 14:58:06 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2017-01-26 16:00:11 +0100 |
commit | 32213bcb7d50e8af2ccd2bf1dbf98b15ff41520a (patch) | |
tree | 3a8e2496cbe942c3c063d781c167869cbc24e83b | |
parent | 1ccf7766efc57d9784e5e0b3cba33f5446052d24 (diff) | |
download | gvfs-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.c | 11 | ||||
-rw-r--r-- | daemon/gvfsbackendmtp.h | 1 |
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; |