From de3553c7f7b0bfba2bc2c93ac9de4903b4840f71 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 28 Nov 2024 21:28:36 +1300 Subject: [PATCH] Fix GTask reference counting Incorrect reference counting of GTask objects meant platform channel method calls would leave tasks alive that would leak memory and leave unclosed references to the binary messenger. --- shell/platform/linux/fl_basic_message_channel.cc | 9 +++++---- shell/platform/linux/fl_binary_messenger.cc | 9 +++++---- shell/platform/linux/fl_method_channel.cc | 9 +++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/shell/platform/linux/fl_basic_message_channel.cc b/shell/platform/linux/fl_basic_message_channel.cc index 7d2b5afe60a6a..b6060fd4a9a79 100644 --- a/shell/platform/linux/fl_basic_message_channel.cc +++ b/shell/platform/linux/fl_basic_message_channel.cc @@ -103,8 +103,8 @@ static void message_cb(FlBinaryMessenger* messenger, static void message_response_cb(GObject* object, GAsyncResult* result, gpointer user_data) { - GTask* task = G_TASK(user_data); - g_task_return_pointer(task, result, g_object_unref); + g_autoptr(GTask) task = G_TASK(user_data); + g_task_return_pointer(task, g_object_ref(result), g_object_unref); } // Called when the channel handler is closed. @@ -257,8 +257,9 @@ G_MODULE_EXPORT FlValue* fl_basic_message_channel_send_finish( g_return_val_if_fail(FL_IS_BASIC_MESSAGE_CHANNEL(self), nullptr); g_return_val_if_fail(g_task_is_valid(result, self), nullptr); - g_autoptr(GTask) task = G_TASK(result); - GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); + GTask* task = G_TASK(result); + g_autoptr(GAsyncResult) r = + G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); g_autoptr(GBytes) message = fl_binary_messenger_send_on_channel_finish(self->messenger, r, error); diff --git a/shell/platform/linux/fl_binary_messenger.cc b/shell/platform/linux/fl_binary_messenger.cc index 16dcd2b86bbc1..fdc75c0a3c69b 100644 --- a/shell/platform/linux/fl_binary_messenger.cc +++ b/shell/platform/linux/fl_binary_messenger.cc @@ -260,8 +260,8 @@ static gboolean send_response(FlBinaryMessenger* messenger, static void platform_message_ready_cb(GObject* object, GAsyncResult* result, gpointer user_data) { - GTask* task = G_TASK(user_data); - g_task_return_pointer(task, result, g_object_unref); + g_autoptr(GTask) task = G_TASK(user_data); + g_task_return_pointer(task, g_object_ref(result), g_object_unref); } static void send_on_channel(FlBinaryMessenger* messenger, @@ -290,8 +290,9 @@ static GBytes* send_on_channel_finish(FlBinaryMessenger* messenger, FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger); g_return_val_if_fail(g_task_is_valid(result, self), FALSE); - g_autoptr(GTask) task = G_TASK(result); - GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); + GTask* task = G_TASK(result); + g_autoptr(GAsyncResult) r = + G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine)); if (engine == nullptr) { diff --git a/shell/platform/linux/fl_method_channel.cc b/shell/platform/linux/fl_method_channel.cc index 266bfa7d812d7..02c9357420097 100644 --- a/shell/platform/linux/fl_method_channel.cc +++ b/shell/platform/linux/fl_method_channel.cc @@ -63,8 +63,8 @@ static void message_cb(FlBinaryMessenger* messenger, static void message_response_cb(GObject* object, GAsyncResult* result, gpointer user_data) { - GTask* task = G_TASK(user_data); - g_task_return_pointer(task, result, g_object_unref); + g_autoptr(GTask) task = G_TASK(user_data); + g_task_return_pointer(task, g_object_ref(result), g_object_unref); } // Called when the channel handler is closed. @@ -196,8 +196,9 @@ G_MODULE_EXPORT FlMethodResponse* fl_method_channel_invoke_method_finish( g_return_val_if_fail(FL_IS_METHOD_CHANNEL(self), nullptr); g_return_val_if_fail(g_task_is_valid(result, self), nullptr); - g_autoptr(GTask) task = G_TASK(result); - GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); + GTask* task = G_TASK(result); + g_autoptr(GAsyncResult) r = + G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); g_autoptr(GBytes) response = fl_binary_messenger_send_on_channel_finish(self->messenger, r, error);