[tracker] Strengthen against sqlite failures in FTS functions (Red Hat #1026283)

Debarshi Ray rishi at fedoraproject.org
Tue Dec 3 17:21:55 UTC 2013


commit 496a99a220db985037f8432c0beb73334a2289bd
Author: Debarshi Ray <debarshir at gnome.org>
Date:   Tue Dec 3 18:15:09 2013 +0100

    Strengthen against sqlite failures in FTS functions (Red Hat #1026283)

 ...hen-against-sqlite-failures-in-FTS-functi.patch |  136 ++++++++++++++++++++
 tracker.spec                                       |   13 ++-
 2 files changed, 146 insertions(+), 3 deletions(-)
---
diff --git a/0001-fts-Strengthen-against-sqlite-failures-in-FTS-functi.patch b/0001-fts-Strengthen-against-sqlite-failures-in-FTS-functi.patch
new file mode 100644
index 0000000..7c6977d
--- /dev/null
+++ b/0001-fts-Strengthen-against-sqlite-failures-in-FTS-functi.patch
@@ -0,0 +1,136 @@
+From 00b71d0f9ae3f4d2b7bc8fa2afe08cd89c5c9c35 Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg at gnome.org>
+Date: Tue, 3 Dec 2013 16:17:54 +0100
+Subject: [PATCH] fts: Strengthen against sqlite failures in FTS functions
+
+function_weights() and function_property_names() (used respectively by
+SPARQL fts:rank and fts:offsets functions), initialize all data at first
+from the database, so it's available in memory for posterior runs,
+although currently those are being quite optimistic about the database
+return values in several ways, so:
+
+- Ensure no infinite loops happen on sqlite3_step() if the stmt trips
+  into some unexpected state. SQLITE_BUSY still does keep looping though.
+
+- As initialization here is a failable task, stop using g_once_init_*
+  and use an static GMutex so initialization can be tried later again
+  if it failed previously.
+
+- For the cases where initialization failed, propagate the error code
+  on the sqlite3_context.
+
+Based on work by Tim Waugh and Michael Catanzaro.
+https://bugzilla.redhat.com/show_bug.cgi?id=1026283
+---
+ src/libtracker-fts/tracker-fts.c | 52 +++++++++++++++++++++++++++-------------
+ 1 file changed, 36 insertions(+), 16 deletions(-)
+
+diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
+index 530d831..446a4a6 100644
+--- a/src/libtracker-fts/tracker-fts.c
++++ b/src/libtracker-fts/tracker-fts.c
+@@ -127,13 +127,15 @@ function_weights (sqlite3_context *context,
+                   sqlite3_value   *argv[])
+ {
+ 	static guint *weights = NULL;
+-	static gsize weights_initialized = 0;
++	static GMutex mutex;
++	int rc = SQLITE_DONE;
+ 
+-	if (g_once_init_enter (&weights_initialized)) {
++	g_mutex_lock (&mutex);
++
++	if (G_UNLIKELY (weights == NULL)) {
+ 		GArray *weight_array;
+ 		sqlite3_stmt *stmt;
+ 		sqlite3 *db;
+-		int rc;
+ 
+ 		weight_array = g_array_new (FALSE, FALSE, sizeof (guint));
+ 		db = sqlite3_context_db_handle (context);
+@@ -149,18 +151,26 @@ function_weights (sqlite3_context *context,
+ 				guint weight;
+ 				weight = sqlite3_column_int (stmt, 0);
+ 				g_array_append_val (weight_array, weight);
++			} else if (rc != SQLITE_BUSY) {
++				break;
+ 			}
+ 		}
+ 
++		sqlite3_finalize (stmt);
++
+ 		if (rc == SQLITE_DONE) {
+-			rc = sqlite3_finalize (stmt);
++			weights = (guint *) g_array_free (weight_array, FALSE);
++		} else {
++			g_array_free (weight_array, TRUE);
+ 		}
+-
+-		weights = (guint *) g_array_free (weight_array, FALSE);
+-		g_once_init_leave (&weights_initialized, (rc == SQLITE_OK));
+ 	}
+ 
+-	sqlite3_result_blob (context, weights, sizeof (weights), NULL);
++	g_mutex_unlock (&mutex);
++
++	if (rc == SQLITE_DONE)
++		sqlite3_result_blob (context, weights, sizeof (weights), NULL);
++	else
++		sqlite3_result_error_code (context, rc);
+ }
+ 
+ static void
+@@ -169,13 +179,15 @@ function_property_names (sqlite3_context *context,
+                          sqlite3_value   *argv[])
+ {
+ 	static gchar **names = NULL;
+-	static gsize names_initialized = 0;
++	static GMutex mutex;
++	int rc = SQLITE_DONE;
+ 
+-	if (g_once_init_enter (&names_initialized)) {
++	g_mutex_lock (&mutex);
++
++	if (G_UNLIKELY (names == NULL)) {
+ 		GPtrArray *names_array;
+ 		sqlite3_stmt *stmt;
+ 		sqlite3 *db;
+-		int rc;
+ 
+ 		names_array = g_ptr_array_new ();
+ 		db = sqlite3_context_db_handle (context);
+@@ -194,18 +206,26 @@ function_property_names (sqlite3_context *context,
+ 
+ 				name = sqlite3_column_text (stmt, 0);
+ 				g_ptr_array_add (names_array, g_strdup (name));
++			} else if (rc != SQLITE_BUSY) {
++				break;
+ 			}
+ 		}
+ 
++		sqlite3_finalize (stmt);
++
+ 		if (rc == SQLITE_DONE) {
+-			rc = sqlite3_finalize (stmt);
++			names = (gchar **) g_ptr_array_free (names_array, FALSE);
++		} else {
++			g_ptr_array_free (names_array, TRUE);
+ 		}
+-
+-		names = (gchar **) g_ptr_array_free (names_array, FALSE);
+-		g_once_init_leave (&names_initialized, (rc == SQLITE_OK));
+ 	}
+ 
+-	sqlite3_result_blob (context, names, sizeof (names), NULL);
++	g_mutex_unlock (&mutex);
++
++	if (rc == SQLITE_DONE)
++		sqlite3_result_blob (context, names, sizeof (names), NULL);
++	else
++		sqlite3_result_error_code (context, rc);
+ }
+ 
+ static void
+-- 
+1.8.4.2
+
diff --git a/tracker.spec b/tracker.spec
index eb99b74..38e86b5 100644
--- a/tracker.spec
+++ b/tracker.spec
@@ -15,7 +15,7 @@
 Summary:	Desktop-neutral search tool and indexer
 Name:		tracker
 Version:	0.16.4
-Release:	1%{?dist}
+Release:	2%{?dist}
 License:	GPLv2+
 Group:		Applications/System
 URL:		http://projects.gnome.org/tracker/
@@ -25,8 +25,11 @@ Source0:	http://download.gnome.org/sources/tracker/0.16/%{name}-%{version}.tar.x
 # https://bugzilla.redhat.com/show_bug.cgi?id=771601
 Patch1:		tracker-0.15-onlyshowin.patch
 
+# https://bugzilla.redhat.com/show_bug.cgi?id=1026283
+Patch2:		0001-fts-Strengthen-against-sqlite-failures-in-FTS-functi.patch
+
 # https://bugzilla.gnome.org/show_bug.cgi?id=712142
-Patch2:         0001-Bump-the-minimum-memory-requirement-to-768M.patch
+Patch3:		0001-Bump-the-minimum-memory-requirement-to-768M.patch
 
 BuildRequires:	poppler-glib-devel libxml2-devel libgsf-devel libgxps-devel
 BuildRequires:	libuuid-devel
@@ -141,7 +144,8 @@ This package contains the documentation for tracker
 %setup -q
 
 %patch1 -p1 -b .onlyshowin
-%patch2 -p1 -b .memory
+%patch2 -p1 -b .fts
+%patch3 -p1 -b .memory
 
 #%global evo_plugins_dir %(pkg-config evolution-plugin-3.0 --variable=plugindir)
 
@@ -274,6 +278,9 @@ fi
 %{_datadir}/gtk-doc/html/ontology/
 
 %changelog
+* Tue Dec 03 2013 Debarshi Ray <rishi at fedoraproject.org> - 0.16.4-2
+- Strengthen against sqlite failures in FTS functions (Red Hat #1026283)
+
 * Sun Nov 24 2013 Kalev Lember <kalevlember at gmail.com> - 0.16.4-1
 - Update to 0.16.4
 - Re-enable upower support


More information about the scm-commits mailing list