summaryrefslogtreecommitdiff
path: root/gtk
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 /gtk
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.
Diffstat (limited to 'gtk')
-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