summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-06-19 00:32:49 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-06-19 00:32:49 -0400
commited50772b4154fb7fa3d48be3c37785199ed21276 (patch)
tree3e961f789646981049fe1604d9b628fa285c1a23
parentd12c7186b6c6db74b507c95b6af11b7d16e99f8a (diff)
downloadgtk+-ed50772b4154fb7fa3d48be3c37785199ed21276.tar.gz
GtkSearchEngine: Avoid a crash
Add a destroy notify for the data of the callback, so we don't end up leaving a dangling pointer behind for a short while if the native engine is finalized before the simple one. This was showing up as crash when typing and backspacing in the search entry of the file chooser.
-rw-r--r--gtk/gtksearchengine.c3
-rw-r--r--gtk/gtksearchenginesimple.c15
-rw-r--r--gtk/gtksearchenginesimple.h3
3 files changed, 18 insertions, 3 deletions
diff --git a/gtk/gtksearchengine.c b/gtk/gtksearchengine.c
index de992e5666..67110f936b 100644
--- a/gtk/gtksearchengine.c
+++ b/gtk/gtksearchengine.c
@@ -334,7 +334,8 @@ _gtk_search_engine_new (void)
connect_engine_signals (engine->priv->native, engine);
_gtk_search_engine_simple_set_indexed_cb (GTK_SEARCH_ENGINE_SIMPLE (engine->priv->simple),
_gtk_search_engine_tracker_is_indexed,
- engine->priv->native);
+ g_object_ref (engine->priv->native),
+ g_object_unref);
}
#endif
diff --git a/gtk/gtksearchenginesimple.c b/gtk/gtksearchenginesimple.c
index b405aef976..00543eaa93 100644
--- a/gtk/gtksearchenginesimple.c
+++ b/gtk/gtksearchenginesimple.c
@@ -57,6 +57,7 @@ struct _GtkSearchEngineSimplePrivate
GtkSearchEngineSimpleIsIndexed is_indexed_callback;
gpointer is_indexed_data;
+ GDestroyNotify is_indexed_data_destroy;
};
@@ -83,6 +84,13 @@ gtk_search_engine_simple_dispose (GObject *object)
priv->active_search = NULL;
}
+ if (priv->is_indexed_data_destroy)
+ priv->is_indexed_data_destroy (priv->is_indexed_data);
+
+ priv->is_indexed_callback = NULL;
+ priv->is_indexed_data = NULL;
+ priv->is_indexed_data_destroy = NULL;
+
G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->dispose (object);
}
@@ -365,8 +373,13 @@ _gtk_search_engine_simple_new (void)
void
_gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
GtkSearchEngineSimpleIsIndexed callback,
- gpointer data)
+ gpointer data,
+ GDestroyNotify destroy)
{
+ if (engine->priv->is_indexed_data_destroy)
+ engine->priv->is_indexed_data_destroy (engine->priv->is_indexed_data);
+
engine->priv->is_indexed_callback = callback;
engine->priv->is_indexed_data = data;
+ engine->priv->is_indexed_data_destroy = destroy;
}
diff --git a/gtk/gtksearchenginesimple.h b/gtk/gtksearchenginesimple.h
index 83a60b1874..421b208e32 100644
--- a/gtk/gtksearchenginesimple.h
+++ b/gtk/gtksearchenginesimple.h
@@ -57,7 +57,8 @@ typedef gboolean (*GtkSearchEngineSimpleIsIndexed) (GFile *location, gpointer da
void _gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
GtkSearchEngineSimpleIsIndexed callback,
- gpointer data);
+ gpointer data,
+ GDestroyNotify destroy);
G_END_DECLS