[tracker/wip/carlosg/sparql1.1: 97/113] libtracker-data: Only restore token if necessary



commit 8d30c3d389c611d853e40fbf9133773b2c201f49
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jul 17 02:17:26 2019 +0200

    libtracker-data: Only restore token if necessary
    
    Doing this is no longer ok since the TrackerToken may hold
    non-static memory. Ensure we don't unset the wrong token in that
    case.

 src/libtracker-data/tracker-sparql.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 50630925c..8bd28fa01 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -3881,6 +3881,7 @@ translate_InsertClause (TrackerSparql  *sparql,
                         GError        **error)
 {
        TrackerToken old_graph;
+       gboolean into = FALSE;
 
        /* InsertClause ::= 'INSERT' QuadPattern
         *
@@ -3895,8 +3896,6 @@ translate_InsertClause (TrackerSparql  *sparql,
        sparql->current_state.blank_node_map =
                g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 
-       old_graph = sparql->current_state.graph;
-
        sparql->current_state.type = TRACKER_SPARQL_TYPE_INSERT;
        _expect (sparql, RULE_TYPE_LITERAL, LITERAL_INSERT);
 
@@ -3910,15 +3909,19 @@ translate_InsertClause (TrackerSparql  *sparql,
        sparql->silent = _accept (sparql, RULE_TYPE_LITERAL, LITERAL_SILENT);
 
        if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_INTO)) {
+               old_graph = sparql->current_state.graph;
                _call_rule (sparql, NAMED_RULE_iri, error);
                _init_token (&sparql->current_state.graph,
                             sparql->current_state.prev_node, sparql);
+               into = TRUE;
        }
 
        _call_rule (sparql, NAMED_RULE_QuadPattern, error);
 
-       tracker_token_unset (&sparql->current_state.graph);
-       sparql->current_state.graph = old_graph;
+       if (into) {
+               tracker_token_unset (&sparql->current_state.graph);
+               sparql->current_state.graph = old_graph;
+       }
 
        if (sparql->blank_nodes) {
                g_variant_builder_close (sparql->blank_nodes);


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