From b34875f78f7cb314197e1deef85b426eb89e2bbe Mon Sep 17 00:00:00 2001 From: Ondrej Holy Date: Mon, 3 Nov 2014 19:17:00 +0100 Subject: 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 --- daemon/gvfsbackendmtp.c | 7 ++++++- daemon/gvfsbackendmtp.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) 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; }; -- cgit v1.2.1