diff options
author | Ondrej Holy <oholy@redhat.com> | 2017-01-26 15:06:15 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2017-01-26 16:00:15 +0100 |
commit | d864620faa2ec65701244a8a216ddfbe3e5bb1e5 (patch) | |
tree | 1497e7007b18ead39f1c2c6ef170980d627b5e57 | |
parent | 32213bcb7d50e8af2ccd2bf1dbf98b15ff41520a (diff) | |
download | gvfs-d864620faa2ec65701244a8a216ddfbe3e5bb1e5.tar.gz |
gphoto2: 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/gvfsbackendgphoto2.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/daemon/gvfsbackendgphoto2.c b/daemon/gvfsbackendgphoto2.c index 54a6f8a9..88e23893 100644 --- a/daemon/gvfsbackendgphoto2.c +++ b/daemon/gvfsbackendgphoto2.c @@ -748,6 +748,8 @@ on_uevent (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer use caches_invalidate_all (gphoto2_backend); g_vfs_backend_force_unmount (G_VFS_BACKEND (gphoto2_backend)); + + g_signal_handlers_disconnect_by_func (gphoto2_backend->gudev_client, on_uevent, gphoto2_backend); } } @@ -1421,6 +1423,18 @@ do_mount (GVfsBackend *backend, g_debug (" mounted %p\n", gphoto2_backend); } +static void +do_unmount (GVfsBackend *backend, GVfsJobUnmount *job, + GMountUnmountFlags flags, + GMountSource *mount_source) +{ + GVfsBackendGphoto2 *gphoto2_backend = G_VFS_BACKEND_GPHOTO2 (backend); + + g_signal_handlers_disconnect_by_func (gphoto2_backend->gudev_client, on_uevent, gphoto2_backend); + + g_vfs_job_succeeded (G_VFS_JOB (job)); +} + /* ------------------------------------------------------------------------------------------------- */ static gboolean @@ -3416,7 +3430,8 @@ g_vfs_backend_gphoto2_class_init (GVfsBackendGphoto2Class *klass) backend_class->try_mount = try_mount; backend_class->mount = do_mount; - backend_class->open_icon_for_read = do_open_icon_for_read; + backend_class->unmount = do_unmount; + backend_class->open_icon_for_read = do_open_icon_for_read; backend_class->open_for_read = do_open_for_read; backend_class->try_read = try_read; backend_class->try_seek_on_read = try_seek_on_read; |