Blob Blame History Raw
From e9e7cda6e5b5e83ac9d3b86127e6877b3f9db980 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Tue, 28 Feb 2017 21:04:12 +0100
Subject: [PATCH] tracker-extract: Cache TrackerConfig::max-bytes

This is the only setting read from extractor modules. It turns out
that under the right circumstances a g_settings_get_value() call
can trigger open() calls with readwrite permissions from the caller
thread. This is forbidden in extractor threads and triggers warnings
like:

dconf-CRITICAL **: unable to create file '/run/user/1000/dconf/user':
Permission denied.  dconf will not work properly.

Also, since this setting is meaningless to update during tracker-extract
lifetime, just drop the g_settings_bind() call, this means the setting
is only read once on startup.

https://bugzilla.gnome.org/show_bug.cgi?id=779342
---
 src/tracker-extract/tracker-config.c | 9 +++++++--
 src/tracker-extract/tracker-config.h | 2 +-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/tracker-extract/tracker-config.c b/src/tracker-extract/tracker-config.c
index cc3063393..728925570 100644
--- a/src/tracker-extract/tracker-config.c
+++ b/src/tracker-extract/tracker-config.c
@@ -226,9 +226,14 @@ config_constructed (GObject *object)
 	 */
 	g_settings_bind (settings, "verbosity", object, "verbosity", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_GET_NO_CHANGES);
 	g_settings_bind (settings, "sched-idle", object, "sched-idle", G_SETTINGS_BIND_GET);
-	g_settings_bind (settings, "max-bytes", object, "max-bytes", G_SETTINGS_BIND_GET);
 	g_settings_bind (settings, "max-media-art-width", object, "max-media-art-width", G_SETTINGS_BIND_GET);
 	g_settings_bind (settings, "wait-for-miner-fs", object, "wait-for-miner-fs", G_SETTINGS_BIND_GET);
+
+	/* Cache settings accessed from extractor modules, we don't want
+	 * the GSettings object accessed within these as it may trigger
+	 * unintended open() calls.
+	 */
+	TRACKER_CONFIG (settings)->max_bytes = g_settings_get_int (settings, "max-bytes");
 }
 
 TrackerConfig *
@@ -303,7 +308,7 @@ tracker_config_get_max_bytes (TrackerConfig *config)
 {
 	g_return_val_if_fail (TRACKER_IS_CONFIG (config), 0);
 
-	return g_settings_get_int (G_SETTINGS (config), "max-bytes");
+	return config->max_bytes;
 }
 
 gint
diff --git a/src/tracker-extract/tracker-config.h b/src/tracker-extract/tracker-config.h
index daf157488..c8af8ef57 100644
--- a/src/tracker-extract/tracker-config.h
+++ b/src/tracker-extract/tracker-config.h
@@ -36,7 +36,7 @@ typedef struct TrackerConfigClass TrackerConfigClass;
 
 struct TrackerConfig {
 	GSettings parent;
-	gpointer priv;
+	gint max_bytes;
 };
 
 struct TrackerConfigClass {
-- 
2.23.0.rc1