You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.6 KiB
71 lines
2.6 KiB
2 years ago
|
From d09b34cde210c4f817d2442cc9378b1ddf73aee9 Mon Sep 17 00:00:00 2001
|
||
|
From: Ondrej Holy <oholy@redhat.com>
|
||
|
Date: Fri, 24 Sep 2021 08:40:23 +0200
|
||
|
Subject: [PATCH] file-operations: Remove leftover files after extraction
|
||
|
failure
|
||
|
|
||
|
Empty, or corrupted files are left in the output directory in the case
|
||
|
of extraction failure, e.g. when wrong password is supplied. This is
|
||
|
in most cases undesired. Let's recursively delete all the leftover
|
||
|
files in the case of extraction failure.
|
||
|
|
||
|
Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1954
|
||
|
---
|
||
|
src/nautilus-file-operations.c | 17 +++++++++++++++++
|
||
|
1 file changed, 17 insertions(+)
|
||
|
|
||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||
|
index 7927bd504..13da2cb39 100644
|
||
|
--- a/src/nautilus-file-operations.c
|
||
|
+++ b/src/nautilus-file-operations.c
|
||
|
@@ -204,6 +204,7 @@ typedef struct
|
||
|
GList *source_files;
|
||
|
GFile *destination_directory;
|
||
|
GList *output_files;
|
||
|
+ gboolean destination_decided;
|
||
|
|
||
|
gdouble base_progress;
|
||
|
|
||
|
@@ -8202,8 +8203,14 @@ extract_job_on_decide_destination (AutoarExtractor *extractor,
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
+ /* The extract_job->destination_decided variable signalizes whether the
|
||
|
+ * extract_job->output_files list already contains the final location as
|
||
|
+ * its first link. There is no way to get this over the AutoarExtractor
|
||
|
+ * API currently.
|
||
|
+ */
|
||
|
extract_job->output_files = g_list_prepend (extract_job->output_files,
|
||
|
decided_destination);
|
||
|
+ extract_job->destination_decided = TRUE;
|
||
|
|
||
|
return g_object_ref (decided_destination);
|
||
|
}
|
||
|
@@ -8336,6 +8343,15 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
+ /* It is safe to use extract_job->output_files->data only when the
|
||
|
+ * extract_job->destination_decided variable was set, see comment in the
|
||
|
+ * extract_job_on_decide_destination function.
|
||
|
+ */
|
||
|
+ if (extract_job->destination_decided)
|
||
|
+ {
|
||
|
+ delete_file_recursively (extract_job->output_files->data, NULL, NULL, NULL);
|
||
|
+ }
|
||
|
+
|
||
|
basename = get_basename (source_file);
|
||
|
nautilus_progress_info_take_status (extract_job->common.progress,
|
||
|
g_strdup_printf (_("Error extracting “%s”"),
|
||
|
@@ -8657,6 +8673,7 @@ extract_task_thread_func (GTask *task,
|
||
|
extract_job);
|
||
|
|
||
|
extract_job->archive_compressed_size = archive_compressed_sizes[i];
|
||
|
+ extract_job->destination_decided = FALSE;
|
||
|
|
||
|
autoar_extractor_start (extractor,
|
||
|
extract_job->common.cancellable);
|
||
|
--
|
||
|
2.33.1
|
||
|
|