From 2e4b51aeb3bd5fa1fda52946e2d43fc8e7a28b4e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 2 May 2009 22:59:02 -0400 Subject: [PATCH] Plug a memory leak in g_simple_async_result_set_op_res_gpointer Fixes bug 579272. --- gio/gsimpleasyncresult.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index d5c3e7bd1..6b73358e5 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -144,6 +144,15 @@ G_DEFINE_TYPE_WITH_CODE (GSimpleAsyncResult, g_simple_async_result, G_TYPE_OBJEC G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, g_simple_async_result_async_result_iface_init)) +static void +clear_op_res (GSimpleAsyncResult *simple) +{ + if (simple->destroy_op_res) + simple->destroy_op_res (simple->op_res.v_pointer); + simple->destroy_op_res = NULL; + simple->op_res.v_ssize = 0; +} + static void g_simple_async_result_finalize (GObject *object) { @@ -154,8 +163,7 @@ g_simple_async_result_finalize (GObject *object) if (simple->source_object) g_object_unref (simple->source_object); - if (simple->destroy_op_res) - simple->destroy_op_res (simple->op_res.v_pointer); + clear_op_res (simple); if (simple->error) g_error_free (simple->error); @@ -375,6 +383,7 @@ g_simple_async_result_set_op_res_gpointer (GSimpleAsyncResult *simple, { g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + clear_op_res (simple); simple->op_res.v_pointer = op_res; simple->destroy_op_res = destroy_op_res; } @@ -407,6 +416,7 @@ g_simple_async_result_set_op_res_gssize (GSimpleAsyncResult *simple, gssize op_res) { g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + clear_op_res (simple); simple->op_res.v_ssize = op_res; } @@ -437,6 +447,7 @@ g_simple_async_result_set_op_res_gboolean (GSimpleAsyncResult *simple, gboolean op_res) { g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + clear_op_res (simple); simple->op_res.v_boolean = !!op_res; }