From ebfe5e44c22b462d47a2c877a8a3455386357204 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 15 Apr 2020 10:46:34 +0200 Subject: [PATCH] x11: Do not trust there is task in error paths Flushing the X11 selection output stream may happen synchronously or implicitly, in which case there is not a task to complete. Check there is actually a task before returning errors. We additionally set the pipe_error flag, so future operations will fail with an error, albeit with a more generic message. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1198 (cherry picked from commit 1909977a6787d6e06d4931df158b821f6fb35ad1) --- src/x11/meta-x11-selection-output-stream.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/x11/meta-x11-selection-output-stream.c b/src/x11/meta-x11-selection-output-stream.c index aa2b78c47..4ccebd2ab 100644 --- a/src/x11/meta-x11-selection-output-stream.c +++ b/src/x11/meta-x11-selection-output-stream.c @@ -286,13 +286,16 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st priv->delete_pending = FALSE; priv->pipe_error = TRUE; - XGetErrorText (xdisplay, error_code, error_str, sizeof (error_str)); - g_task_return_new_error (priv->pending_task, - G_IO_ERROR, - G_IO_ERROR_BROKEN_PIPE, - "Failed to flush selection output stream: %s", - error_str); - g_clear_object (&priv->pending_task); + if (priv->pending_task) + { + XGetErrorText (xdisplay, error_code, error_str, sizeof (error_str)); + g_task_return_new_error (priv->pending_task, + G_IO_ERROR, + G_IO_ERROR_BROKEN_PIPE, + "Failed to flush selection output stream: %s", + error_str); + g_clear_object (&priv->pending_task); + } } else if (priv->pending_task && priv->data->len == 0 && !priv->delete_pending) {