[tracker/sam/error-no-ontology: 2/2] libtracker-sparql: Raise an error if no ontology is passed



commit 450ebceabb408b1090a2c8a7b5d6a43995aea831
Author: Sam Thursfield <sam afuera me uk>
Date:   Wed Apr 29 01:56:56 2020 +0200

    libtracker-sparql: Raise an error if no ontology is passed
    
    Since a0efd1972b122d0a2 it was possible to crash by passing a NULL
    ontology path to tracker_sparql_connection_new(). Now we raise an
    error instead.

 src/libtracker-data/tracker-data-manager.c    |  9 +++++++++
 src/libtracker-direct/tracker-direct.c        |  5 +++++
 src/libtracker-sparql/tracker-connection.h    |  3 ++-
 tests/libtracker-sparql/tracker-sparql-test.c | 18 ++++++++++++++++++
 4 files changed, 34 insertions(+), 1 deletion(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 25a3e65a3..a21251b4b 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -4109,6 +4109,15 @@ tracker_data_manager_initable_init (GInitable     *initable,
                TrackerOntology **ontologies;
                guint n_ontologies, i;
 
+               if (!manager->ontology_location) {
+                       g_set_error (error,
+                                    TRACKER_DATA_ONTOLOGY_ERROR,
+                                    TRACKER_DATA_ONTOLOGY_NOT_FOUND,
+                                    "You must pass an ontology location. "
+                                    "Use tracker_sparql_get_ontology_nepomuk() to find the default 
ontologies.");
+                       return FALSE;
+               }
+
                g_info ("Applying ontologies from %s", g_file_peek_path (manager->ontology_location));
                sorted = get_ontologies (manager, manager->ontology_location, &internal_error);
 
diff --git a/src/libtracker-direct/tracker-direct.c b/src/libtracker-direct/tracker-direct.c
index 53d6f01fb..8fd27abb2 100644
--- a/src/libtracker-direct/tracker-direct.c
+++ b/src/libtracker-direct/tracker-direct.c
@@ -243,6 +243,11 @@ translate_error (GError *error)
        if (error->domain == TRACKER_DATA_ONTOLOGY_ERROR) {
                /* This is an internal error domain, so translate to a libtracker-sparql error code. */
                switch (error->code) {
+                       case TRACKER_DATA_ONTOLOGY_NOT_FOUND:
+                               new_error = g_error_new_literal (TRACKER_SPARQL_ERROR,
+                                                                TRACKER_SPARQL_ERROR_ONTOLOGY_NOT_FOUND,
+                                                                error->message);
+                               break;
                        case TRACKER_DATA_UNSUPPORTED_LOCATION:
                        case TRACKER_DATA_UNSUPPORTED_ONTOLOGY_CHANGE:
                                new_error = g_error_new_literal (TRACKER_SPARQL_ERROR,
diff --git a/src/libtracker-sparql/tracker-connection.h b/src/libtracker-sparql/tracker-connection.h
index f35d22acb..9d14b1697 100644
--- a/src/libtracker-sparql/tracker-connection.h
+++ b/src/libtracker-sparql/tracker-connection.h
@@ -93,7 +93,8 @@ typedef enum {
        TRACKER_SPARQL_ERROR_NO_SPACE,
        TRACKER_SPARQL_ERROR_INTERNAL,
        TRACKER_SPARQL_ERROR_UNSUPPORTED,
-       TRACKER_SPARQL_ERROR_UNKNOWN_GRAPH
+       TRACKER_SPARQL_ERROR_UNKNOWN_GRAPH,
+       TRACKER_SPARQL_ERROR_ONTOLOGY_NOT_FOUND,
 } TrackerSparqlError;
 
 #define TRACKER_SPARQL_ERROR tracker_sparql_error_quark ()
diff --git a/tests/libtracker-sparql/tracker-sparql-test.c b/tests/libtracker-sparql/tracker-sparql-test.c
index f2211ee88..43cb1572b 100644
--- a/tests/libtracker-sparql/tracker-sparql-test.c
+++ b/tests/libtracker-sparql/tracker-sparql-test.c
@@ -220,6 +220,22 @@ test_tracker_sparql_cursor_next_async (void)
        g_main_loop_run (main_loop);
 }
 
+/* Test that we return an error if no ontology is passed. */
+static void
+test_tracker_sparql_connection_no_ontology (void)
+{
+       GError *error = NULL;
+
+       TrackerSparqlConnection *connection;
+
+       connection = tracker_sparql_connection_new (0, NULL, NULL, NULL, &error);
+
+       g_assert_null (connection);
+       g_assert_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_ONTOLOGY_NOT_FOUND);
+
+       g_error_free (error);
+}
+
 static void
 test_tracker_sparql_connection_interleaved (void)
 {
@@ -279,6 +295,8 @@ main (gint argc, gchar **argv)
                         test_tracker_sparql_escape_string);
        g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_escape_uri_vprintf",
                         test_tracker_sparql_escape_uri_vprintf);
+       g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_connection_no_ontology",
+                        test_tracker_sparql_connection_no_ontology);
        g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_connection_interleaved",
                         test_tracker_sparql_connection_interleaved);
        g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_cursor_next_async",


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]