summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2014-11-03 19:17:00 +0100
committerOndrej Holy <oholy@redhat.com>2014-11-04 13:40:10 +0100
commit37727a10ee377d5675413c9d72fee4b9273c60b2 (patch)
tree2e6fc01cc5766aa856e749ffc8bd5cc64463ca3a
parent35adf5e4e2c4ef828165f6ea56fbe96255dfd8fc (diff)
downloadgvfs-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
-rw-r--r--daemon/gvfsbackendmtp.c7
-rw-r--r--daemon/gvfsbackendmtp.h1
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;
};