summaryrefslogtreecommitdiff
path: root/extractor-Fix-extraction-of-raw-format-archives.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extractor-Fix-extraction-of-raw-format-archives.patch')
-rw-r--r--extractor-Fix-extraction-of-raw-format-archives.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/extractor-Fix-extraction-of-raw-format-archives.patch b/extractor-Fix-extraction-of-raw-format-archives.patch
new file mode 100644
index 0000000..45038a4
--- /dev/null
+++ b/extractor-Fix-extraction-of-raw-format-archives.patch
@@ -0,0 +1,108 @@
+From b46a189982945d7154a12be59533f6385833a9cb Mon Sep 17 00:00:00 2001
+From: Ondrej Holy <oholy@redhat.com>
+Date: Tue, 30 Nov 2021 13:39:55 +0100
+Subject: [PATCH] extractor: Fix extraction of raw format archives
+
+An extraction of raw format archives leads to crashes currently.
+This is because the generic "data" string is returned from libarchive
+instead of the real pathname, which is not expected currently. Let's
+handle this case properly and fallback to the source basename.
+
+Fixes: https://gitlab.gnome.org/GNOME/gnome-autoar/-/issues/38
+---
+ gnome-autoar/autoar-extractor.c | 53 +++++++++++++++++++--------------
+ 1 file changed, 31 insertions(+), 22 deletions(-)
+
+diff --git a/gnome-autoar/autoar-extractor.c b/gnome-autoar/autoar-extractor.c
+index eb3edda..bb60901 100644
+--- a/gnome-autoar/autoar-extractor.c
++++ b/gnome-autoar/autoar-extractor.c
+@@ -964,6 +964,7 @@ autoar_extractor_check_file_conflict (AutoarExtractor *self,
+
+ /* Check also parents for conflict to be sure it is directory. */
+ parent = g_file_get_parent (file);
++ g_return_val_if_fail (parent, NULL);
+ return autoar_extractor_check_file_conflict (self, parent, AE_IFDIR);
+ }
+
+@@ -1664,11 +1665,15 @@ autoar_extractor_step_scan_toplevel (AutoarExtractor *self)
+ return;
+ }
+ self->use_raw_format = TRUE;
++
++ g_debug ("autoar_extractor_step_scan_toplevel: using raw format");
+ }
+
+ while ((r = archive_read_next_header (a, &entry)) == ARCHIVE_OK) {
+ const char *pathname;
+ g_autofree char *utf8_pathname = NULL;
++ const char *symlink_pathname;
++ const char *hardlink_pathname;
+
+ if (g_cancellable_is_cancelled (self->cancellable)) {
+ archive_read_free (a);
+@@ -1683,28 +1688,26 @@ autoar_extractor_step_scan_toplevel (AutoarExtractor *self)
+ }
+ }
+
+- if (self->use_raw_format) {
+- pathname = autoar_common_get_basename_remove_extension (g_file_peek_path (self->source_file));
+- g_debug ("autoar_extractor_step_scan_toplevel: %d: raw pathname = %s",
+- self->total_files, pathname);
+- } else {
+- const char *symlink_pathname;
+- const char *hardlink_pathname;
+-
+- pathname = archive_entry_pathname (entry);
+- utf8_pathname = autoar_common_get_utf8_pathname (pathname);
+- symlink_pathname = archive_entry_symlink (entry);
+- hardlink_pathname = archive_entry_hardlink (entry);
+-
+- g_debug ("autoar_extractor_step_scan_toplevel: %d: pathname = %s%s%s%s%s%s%s",
+- self->total_files, pathname,
+- utf8_pathname ? " utf8 pathname = " : "",
+- utf8_pathname ? utf8_pathname : "",
+- symlink_pathname ? " symlink = " : "",
+- symlink_pathname ? symlink_pathname : "",
+- hardlink_pathname ? " hardlink = " : "",
+- hardlink_pathname ? hardlink_pathname : "");
+- }
++ pathname = archive_entry_pathname (entry);
++ utf8_pathname = autoar_common_get_utf8_pathname (pathname);
++ symlink_pathname = archive_entry_symlink (entry);
++ hardlink_pathname = archive_entry_hardlink (entry);
++
++ /* The raw format usually doesn't propagate file name and the generic "data"
++ * string is returned instead. Let's use source basename in that case.
++ */
++ if (self->use_raw_format && g_str_equal (pathname, "data"))
++ pathname = autoar_common_get_basename_remove_extension (self->source_basename);
++
++ g_debug ("autoar_extractor_step_scan_toplevel: %d: pathname = %s%s%s%s%s%s%s",
++ self->total_files, pathname,
++ utf8_pathname ? " utf8 pathname = " : "",
++ utf8_pathname ? utf8_pathname : "",
++ symlink_pathname ? " symlink = " : "",
++ symlink_pathname ? symlink_pathname : "",
++ hardlink_pathname ? " hardlink = " : "",
++ hardlink_pathname ? hardlink_pathname : "");
++
+ self->files_list =
+ g_list_prepend (self->files_list,
+ autoar_extractor_do_sanitize_pathname (self,
+@@ -1889,6 +1892,12 @@ autoar_extractor_step_extract (AutoarExtractor *self) {
+ pathname = archive_entry_pathname (entry);
+ hardlink = archive_entry_hardlink (entry);
+
++ /* The raw format usually doesn't propagate file name and the generic "data"
++ * string is returned instead. Let's use source basename in that case.
++ */
++ if (self->use_raw_format && g_str_equal (pathname, "data"))
++ pathname = autoar_common_get_basename_remove_extension (self->source_basename);
++
+ extracted_filename =
+ autoar_extractor_do_sanitize_pathname (self, pathname);
+
+--
+2.33.1
+