[gnome-software] Add missing locking for Fedora distro upgrades plugin
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Add missing locking for Fedora distro upgrades plugin
- Date: Tue, 31 Oct 2017 17:03:12 +0000 (UTC)
commit 6a347f1087f577a0349cb83ce78b658bee7dd37e
Author: Kalev Lember <klember redhat com>
Date: Tue Oct 31 17:34:16 2017 +0100
Add missing locking for Fedora distro upgrades plugin
This should fix multiple crashers reported in Fedora bugzilla for 3.26
that all look like they are due to accessing internal data structures
(mainly priv->distros) concurrently from multiple threads.
https://bugzilla.redhat.com/show_bug.cgi?id=1502816
https://bugzilla.redhat.com/show_bug.cgi?id=1507307
.../gs-plugin-fedora-pkgdb-collections.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
index ea4738f..39cb610 100644
--- a/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
+++ b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
@@ -37,6 +37,7 @@ struct GsPluginData {
GSettings *settings;
gboolean is_valid;
GPtrArray *distros;
+ GMutex mutex;
};
typedef enum {
@@ -64,6 +65,8 @@ gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+ g_mutex_init (&priv->mutex);
+
/* check that we are running on Fedora */
if (!gs_plugin_check_distro_id (plugin, "fedora")) {
gs_plugin_set_enabled (plugin, FALSE);
@@ -94,6 +97,7 @@ gs_plugin_destroy (GsPlugin *plugin)
g_ptr_array_unref (priv->distros);
g_free (priv->os_name);
g_free (priv->cachefn);
+ g_mutex_clear (&priv->mutex);
}
static void
@@ -129,6 +133,7 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
gchar *endptr = NULL;
g_autoptr(GFile) file = NULL;
g_autoptr(GsOsRelease) os_release = NULL;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->mutex);
/* get the file to cache */
priv->cachefn = gs_utils_get_cache_filename ("fedora-pkgdb-collections",
@@ -231,6 +236,9 @@ gs_plugin_refresh (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
+ GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->mutex);
+
/* only for update metadata */
if ((flags & GS_PLUGIN_REFRESH_FLAGS_METADATA) == 0)
return TRUE;
@@ -500,6 +508,7 @@ gs_plugin_add_distro_upgrades (GsPlugin *plugin,
GError **error)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->mutex);
/* ensure valid data is loaded */
if (!_ensure_cache (plugin, cancellable, error))
@@ -525,8 +534,10 @@ gs_plugin_refine_app (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
+ GsPluginData *priv = gs_plugin_get_data (plugin);
PkgdbItem *item;
const gchar *cpe_name;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&priv->mutex);
/* not for us */
if (gs_app_get_kind (app) != AS_APP_KIND_OS_UPGRADE)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]