diff options
author | Michael Catanzaro <mcatanzaro@posteo.net> | 2019-05-06 21:50:25 +0000 |
---|---|---|
committer | Michael Catanzaro <mcatanzaro@posteo.net> | 2019-05-06 21:50:25 +0000 |
commit | b17436d952f5ad682dfe98e0eca7bc31705cf776 (patch) | |
tree | b32689f9d95f699b3b7cd14b3ce23ac57a40172c | |
parent | 88117906534bf625c8b84f2749e6dcc1fcc521f4 (diff) | |
parent | 313e7cbad779fb36e3d999474e00a0a249d9f273 (diff) | |
download | glib-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
-rw-r--r-- | gio/gsocketclient.c | 21 |
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); } |