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:46:20 +0100
commitb34875f78f7cb314197e1deef85b426eb89e2bbe (patch)
tree3cb328b84549860b37f6557d4eaf116d2016939a
parent8630d4af19dda3f0d9339bbb99e28b12c25497f2 (diff)
downloadgvfs-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.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 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;
};