summaryrefslogtreecommitdiff
path: root/gio
diff options
context:
space:
mode:
authorMichael Catanzaro <mcatanzaro@posteo.net>2019-05-06 21:50:25 +0000
committerMichael Catanzaro <mcatanzaro@posteo.net>2019-05-06 21:50:25 +0000
commitb17436d952f5ad682dfe98e0eca7bc31705cf776 (patch)
treeb32689f9d95f699b3b7cd14b3ce23ac57a40172c /gio
parent88117906534bf625c8b84f2749e6dcc1fcc521f4 (diff)
parent313e7cbad779fb36e3d999474e00a0a249d9f273 (diff)
downloadglib-b17436d952f5ad682dfe98e0eca7bc31705cf776.tar.gz
Merge branch 'wip/tingping/socketclient-cancel-2' into 'master'
gsocketclient: Fix potential critical when cancelling connect Closes #1747 See merge request GNOME/glib!783
Diffstat (limited to 'gio')
-rw-r--r--gio/gsocketclient.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c
index 83cb945c7..5faa02ecb 100644
--- a/gio/gsocketclient.c
+++ b/gio/gsocketclient.c
@@ -1427,15 +1427,24 @@ g_socket_client_async_connect_complete (GSocketClientAsyncConnectData *data)
data->connection = (GIOStream *)wrapper_connection;
}
- if (!g_task_return_error_if_cancelled (data->task))
+ if (!data->completed)
{
- g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, data->connection);
- g_task_return_pointer (data->task, g_steal_pointer (&data->connection), g_object_unref);
+ GError *error = NULL;
+
+ if (g_cancellable_set_error_if_cancelled (g_task_get_cancellable (data->task), &error))
+ {
+ g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, NULL);
+ g_task_return_error (data->task, g_steal_pointer (&error));
+ }
+ else
+ {
+ g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, data->connection);
+ g_task_return_pointer (data->task, g_steal_pointer (&data->connection), g_object_unref);
+ }
+
+ data->completed = TRUE;
}
- else
- g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, NULL);
- data->completed = TRUE;
g_object_unref (data->task);
}