[gvfs] mtp: Disconnect uevent handler immediately



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]