From 800c690a9c90be5976e2b2b086f52e68b0fd8542 Mon Sep 17 00:00:00 2001 From: Gary Li Date: Wed, 15 May 2024 14:46:32 -0400 Subject: [PATCH] files-view: check if gdk_clipboard_read_value_async operation was cancelled Nautilus crashes if the user with a cut selection rapidly opens then closes a tab. This is because update_cut_status_callback is called after the files view has already been finalized. GIO guarantees that our callback will always be called even if we cancel the clipboard cancellable in dispose. Check cancellation status in update_cut_status_callback and proceed no further if cancelled. Fixes https://gitlab.gnome.org/GNOME/nautilus/-/issues/3434 --- src/nautilus-files-view.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 25638d60c..40c42d2ca 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -681,12 +681,23 @@ update_cut_status_callback (GObject *source_object, GAsyncResult *res, gpointer user_data) { - NautilusFilesView *self = NAUTILUS_FILES_VIEW (user_data); - NautilusFilesViewPrivate *priv = nautilus_files_view_get_instance_private (self); + NautilusFilesView *self; + NautilusFilesViewPrivate *priv; const GValue *value; GList *cut_files = NULL; + g_autoptr (GError) error = NULL; + + value = gdk_clipboard_read_value_finish (GDK_CLIPBOARD (source_object), res, &error); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + /* The files view has already been disposed, bailout */ + return; + } + + self = NAUTILUS_FILES_VIEW (user_data); + priv = nautilus_files_view_get_instance_private (self); - value = gdk_clipboard_read_value_finish (GDK_CLIPBOARD (source_object), res, NULL); if (value != NULL && G_VALUE_HOLDS (value, NAUTILUS_TYPE_CLIPBOARD)) {