diff options
author | Ruslan N. Marchenko <me@ruff.mobi> | 2020-11-01 20:23:41 +0100 |
---|---|---|
committer | Ruslan N. Marchenko <me@ruff.mobi> | 2020-11-15 09:10:37 +0100 |
commit | 322fb7eb4c01642fa0bf9cad01dd770430496bbe (patch) | |
tree | 6f7d43dbaf8449b23317d41bcda34da515024eda | |
parent | 1710635a646ac8c7d6c70b0e09ac028c8ec1d694 (diff) | |
download | wocky-322fb7eb4c01642fa0bf9cad01dd770430496bbe.tar.gz |
Fix racy error handling in xmpp-connection
-rw-r--r-- | wocky/wocky-xmpp-connection.c | 31 |
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); } |