From 1e3ecccef7791f762757f2046abab5c37449feb8 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 14 Dec 2024 12:39:17 +0100 Subject: [PATCH 1/2] library: Register GResources manually Automatic registration of GResources does not work on all compilers and environments. A notable one is building with -Ddefault_library=static as that will make the final executables lack the expected ontology resources. We want to support static compilation for OSS Fuzz, make registration manual so that this data is not snipped from the final executable. --- src/libtracker-sparql/meson.build | 2 +- src/libtracker-sparql/tracker-connection.c | 3 +++ src/libtracker-sparql/tracker-private.h | 2 ++ src/libtracker-sparql/tracker-utils.c | 21 +++++++++++++++++++++ src/ontologies/meson.build | 13 +++++++++++-- 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/libtracker-sparql/meson.build b/src/libtracker-sparql/meson.build index 1b353dee6..678423d73 100644 --- a/src/libtracker-sparql/meson.build +++ b/src/libtracker-sparql/meson.build @@ -111,7 +111,7 @@ libtracker_sparql_private = static_library('tracker-sparql-private', dependencies: [libtracker_sparql_dependencies], gnu_symbol_visibility: 'hidden', - include_directories: [core_incs], + include_directories: [core_incs, ontology_incs], ) tracker_sparql_private_dep = declare_dependency( diff --git a/src/libtracker-sparql/tracker-connection.c b/src/libtracker-sparql/tracker-connection.c index 159fe3133..5c8d3296a 100644 --- a/src/libtracker-sparql/tracker-connection.c +++ b/src/libtracker-sparql/tracker-connection.c @@ -115,6 +115,9 @@ tracker_sparql_connection_class_init (TrackerSparqlConnectionClass *klass) /* Initialize debug flags */ tracker_get_debug_flags (); + + /* Initialize GResources */ + tracker_ensure_resources (); } gboolean diff --git a/src/libtracker-sparql/tracker-private.h b/src/libtracker-sparql/tracker-private.h index eef366d51..86231d8d7 100644 --- a/src/libtracker-sparql/tracker-private.h +++ b/src/libtracker-sparql/tracker-private.h @@ -377,3 +377,5 @@ GBytes * tracker_sparql_make_langstring (const gchar *str, gboolean tracker_rdf_format_pick_for_file (GFile *file, TrackerRdfFormat *format_out); + +void tracker_ensure_resources (void); diff --git a/src/libtracker-sparql/tracker-utils.c b/src/libtracker-sparql/tracker-utils.c index 513de958d..1e605bbef 100644 --- a/src/libtracker-sparql/tracker-utils.c +++ b/src/libtracker-sparql/tracker-utils.c @@ -23,6 +23,9 @@ #include "tracker-enums.h" +#include "tracker-gresources.h" +#include "tracker-nepomuk-gresources.h" + #include static const char *extensions[] = { @@ -120,6 +123,8 @@ tracker_sparql_get_uuid_urn (void) GFile * tracker_sparql_get_ontology_nepomuk (void) { + tracker_ensure_resources (); + return g_file_new_for_uri ("resource://org/freedesktop/tracker/nepomuk"); } @@ -171,3 +176,19 @@ tracker_rdf_format_pick_for_file (GFile *file, g_free (uri); return TRUE; } + +static gpointer +register_resources (gpointer data) +{ + builtin_ontology_register_resource (); + nepomuk_ontology_register_resource (); + return NULL; +} + +void +tracker_ensure_resources (void) +{ + static GOnce register_resources_once = G_ONCE_INIT; + + g_once (®ister_resources_once, register_resources, NULL); +} diff --git a/src/ontologies/meson.build b/src/ontologies/meson.build index 4437049e5..26ef32d0f 100644 --- a/src/ontologies/meson.build +++ b/src/ontologies/meson.build @@ -31,5 +31,14 @@ nepomuk = files( 'nepomuk/93-libosinfo.ontology', ) -tracker_gresources = gnome.compile_resources('tracker_gresources', 'builtin-ontology.gresource.xml') -tracker_nepomuk_gresources = gnome.compile_resources('tracker_nepomuk_gresources', 'nepomuk-ontology.gresource.xml') +ontology_incs = include_directories('.') + +tracker_gresources = gnome.compile_resources( + 'tracker-gresources', + 'builtin-ontology.gresource.xml', + extra_args: ['--manual-register']) + +tracker_nepomuk_gresources = gnome.compile_resources( + 'tracker-nepomuk-gresources', + 'nepomuk-ontology.gresource.xml', + extra_args: ['--manual-register']) -- GitLab From 364e50e1631e3abbb720f6c593198510d645c437 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 14 Dec 2024 10:43:56 +0100 Subject: [PATCH 2/2] core: Plug leak on data manager initialization failure If we don't fully initialize the data manager, nothing will ever call tracker_data_manager_shutdown() on it, ensuring the reference cycle between the underlying DB interfaces and the data manager is never undone, so it will never finalize naturally. Finish the DB manager explicitly in the TrackerDataManager initialization error paths, so that DB interfaces are ensured to be closed, and no dangling references left. --- src/libtracker-sparql/core/tracker-data-manager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libtracker-sparql/core/tracker-data-manager.c b/src/libtracker-sparql/core/tracker-data-manager.c index 3bae31650..827156b14 100644 --- a/src/libtracker-sparql/core/tracker-data-manager.c +++ b/src/libtracker-sparql/core/tracker-data-manager.c @@ -2481,6 +2481,8 @@ tracker_data_manager_initable_init (GInitable *initable, if (create_db) tracker_db_manager_rollback_db_creation (manager->db_manager); + g_clear_object (&manager->data_update); + g_clear_object (&manager->db_manager); g_clear_object (¤t_ontology); g_clear_object (&db_ontology); g_free (checksum); -- GitLab