diff options
author | Ondrej Holy <oholy@redhat.com> | 2014-11-03 19:17:00 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2014-11-04 13:40:10 +0100 |
commit | 37727a10ee377d5675413c9d72fee4b9273c60b2 (patch) | |
tree | 2e6fc01cc5766aa856e749ffc8bd5cc64463ca3a /daemon | |
parent | 35adf5e4e2c4ef828165f6ea56fbe96255dfd8fc (diff) | |
download | gvfs-37727a10ee377d5675413c9d72fee4b9273c60b2.tar.gz |
mtp: do not crash when device is unplugged
Leak the mutex if the backend is force unmounted to avoid crash
caused by abort(), when trying to clear already locked mutex.
https://bugzilla.gnome.org/show_bug.cgi?id=739575
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsbackendmtp.c | 7 | ||||
-rw-r--r-- | daemon/gvfsbackendmtp.h | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c index 63a213b4..abb69f95 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -415,7 +415,11 @@ g_vfs_backend_mtp_finalize (GObject *object) g_hash_table_foreach (backend->monitors, remove_monitor_weak_ref, backend->monitors); g_hash_table_unref (backend->monitors); - g_mutex_clear (&backend->mutex); + + /* Leak the mutex if the backend is force unmounted to avoid crash caused by + * abort(), when trying to clear already locked mutex. */ + if (!backend->force_unmounted) + g_mutex_clear (&backend->mutex); (*G_OBJECT_CLASS (g_vfs_backend_mtp_parent_class)->finalize) (object); @@ -591,6 +595,7 @@ on_uevent (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer use (char *)path); } + op_backend->force_unmounted = TRUE; g_vfs_backend_force_unmount ((GVfsBackend*)op_backend); } diff --git a/daemon/gvfsbackendmtp.h b/daemon/gvfsbackendmtp.h index c45618b8..9ae03018 100644 --- a/daemon/gvfsbackendmtp.h +++ b/daemon/gvfsbackendmtp.h @@ -61,6 +61,7 @@ struct _GVfsBackendMtp GHashTable *monitors; guint hb_id; gint unmount_started; + gboolean force_unmounted; gboolean android_extension; }; |