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:46:20 +0100 |
commit | b34875f78f7cb314197e1deef85b426eb89e2bbe (patch) | |
tree | 3cb328b84549860b37f6557d4eaf116d2016939a | |
parent | 8630d4af19dda3f0d9339bbb99e28b12c25497f2 (diff) | |
download | gvfs-b34875f78f7cb314197e1deef85b426eb89e2bbe.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
-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 8f1c4df6..a606055f 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -426,7 +426,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); @@ -602,6 +606,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 ce2159d8..f477697a 100644 --- a/daemon/gvfsbackendmtp.h +++ b/daemon/gvfsbackendmtp.h @@ -58,6 +58,7 @@ struct _GVfsBackendMtp GHashTable *monitors; guint hb_id; gint unmount_started; + gboolean force_unmounted; gboolean android_extension; }; |