summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuslan N. Marchenko <me@ruff.mobi>2020-11-01 20:23:41 +0100
committerRuslan N. Marchenko <me@ruff.mobi>2020-11-15 09:10:37 +0100
commit322fb7eb4c01642fa0bf9cad01dd770430496bbe (patch)
tree6f7d43dbaf8449b23317d41bcda34da515024eda
parent1710635a646ac8c7d6c70b0e09ac028c8ec1d694 (diff)
downloadwocky-322fb7eb4c01642fa0bf9cad01dd770430496bbe.tar.gz
Fix racy error handling in xmpp-connection
-rw-r--r--wocky/wocky-xmpp-connection.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/wocky/wocky-xmpp-connection.c b/wocky/wocky-xmpp-connection.c
index 4d4fdce..2817935 100644
--- a/wocky/wocky-xmpp-connection.c
+++ b/wocky/wocky-xmpp-connection.c
@@ -261,16 +261,13 @@ wocky_xmpp_connection_write_cb (GObject *source,
&error);
if (G_UNLIKELY (written < 0))
- {
- g_task_return_error (priv->output_task, error);
- goto finished;
- }
+ goto finished;
if (G_UNLIKELY (written == 0))
{
- g_task_return_new_error (priv->output_task,
- WOCKY_XMPP_CONNECTION_ERROR, WOCKY_XMPP_CONNECTION_ERROR_EOS,
- "Connection got disconnected" );
+ g_clear_error (&error);
+ error = g_error_new_literal (WOCKY_XMPP_CONNECTION_ERROR,
+ WOCKY_XMPP_CONNECTION_ERROR_EOS, "Connection got disconnected" );
goto finished;
}
@@ -295,8 +292,10 @@ finished:
priv->output_cancellable = NULL;
priv->output_task = NULL;
- if (!g_task_had_error (t))
+ if (error == NULL)
g_task_return_boolean (t, TRUE);
+ else
+ g_task_return_error (t, error);
g_object_unref (t);
}
@@ -462,16 +461,14 @@ _xmpp_connection_received_data (GObject *source,
result, &error);
if (G_UNLIKELY (size < 0))
- {
- g_task_return_error (priv->input_task, error);
- goto finished;
- }
+ goto finished;
if (G_UNLIKELY (size == 0))
{
- g_task_return_new_error (priv->input_task,
- WOCKY_XMPP_CONNECTION_ERROR, WOCKY_XMPP_CONNECTION_ERROR_EOS,
- "Connection got disconnected" );
+ g_clear_error (&error);
+ error = g_error_new_literal (WOCKY_XMPP_CONNECTION_ERROR,
+ WOCKY_XMPP_CONNECTION_ERROR_EOS,
+ "Connection got disconnected" );
goto finished;
}
@@ -513,8 +510,10 @@ finished:
priv->input_cancellable = NULL;
priv->input_task = NULL;
- if (!g_task_had_error (t))
+ if (error == NULL)
g_task_return_boolean (t, TRUE);
+ else
+ g_task_return_error (t, error);
g_object_unref (t);
}