From dab0cacb12ecbb524558e4afd76af12f4b64d86c Mon Sep 17 00:00:00 2001 From: Ondrej Holy Date: Tue, 7 Dec 2021 10:12:19 +0100 Subject: [PATCH] Fix extraction of raw format archives Related: #2029425 (cherry picked from Fedora commit 2b08be56864bee112f90c9acae029eb6d47467ae) --- ...ix-extraction-of-raw-format-archives.patch | 108 ++++++++++++++++++ ...tor-Fix-extraction-to-root-directory.patch | 44 +++++++ gnome-autoar.spec | 9 +- 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 extractor-Fix-extraction-of-raw-format-archives.patch create mode 100644 extractor-Fix-extraction-to-root-directory.patch 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 +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 + diff --git a/extractor-Fix-extraction-to-root-directory.patch b/extractor-Fix-extraction-to-root-directory.patch new file mode 100644 index 0000000..b457103 --- /dev/null +++ b/extractor-Fix-extraction-to-root-directory.patch @@ -0,0 +1,44 @@ +From 7237276439281abfedd619ecf6f5c17fae411137 Mon Sep 17 00:00:00 2001 +From: Ondrej Holy +Date: Tue, 30 Nov 2021 13:45:07 +0100 +Subject: [PATCH] extractor: Fix extraction to root directory + +An extraction to the root of an archive which contains the "/" path +leads to crashes. Let's handle this rare corner case. + +Relates: https://gitlab.gnome.org/GNOME/gnome-autoar/-/issues/38 +--- + gnome-autoar/autoar-extractor.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/gnome-autoar/autoar-extractor.c b/gnome-autoar/autoar-extractor.c +index bb60901..ab68c47 100644 +--- a/gnome-autoar/autoar-extractor.c ++++ b/gnome-autoar/autoar-extractor.c +@@ -857,6 +857,14 @@ autoar_extractor_get_common_prefix (GList *files, + while (!g_file_has_parent (prefix, root)) { + file = g_file_get_parent (prefix); + g_object_unref (prefix); ++ ++ /* This can happen if the archive contains the "/" path and the destination ++ * is "/" as well. ++ */ ++ if (file == NULL) { ++ return NULL; ++ } ++ + prefix = file; + } + +@@ -984,7 +992,7 @@ autoar_extractor_do_write_entry (AutoarExtractor *self, + { + GFile *parent; + parent = g_file_get_parent (dest); +- if (!g_file_query_exists (parent, self->cancellable)) ++ if (parent && !g_file_query_exists (parent, self->cancellable)) + g_file_make_directory_with_parents (parent, + self->cancellable, + NULL); +-- +2.33.1 + diff --git a/gnome-autoar.spec b/gnome-autoar.spec index d549470..0322ff6 100644 --- a/gnome-autoar.spec +++ b/gnome-autoar.spec @@ -1,12 +1,16 @@ Name: gnome-autoar Version: 0.4.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Archive library License: LGPLv2+ URL: https://git.gnome.org/browse/gnome-autoar Source0: https://download.gnome.org/sources/gnome-autoar/0.4/gnome-autoar-%{version}.tar.xz +# https://gitlab.gnome.org/GNOME/gnome-autoar/-/issues/38 +Patch0: extractor-Fix-extraction-of-raw-format-archives.patch +Patch1: extractor-Fix-extraction-to-root-directory.patch + BuildRequires: gcc BuildRequires: meson BuildRequires: gtk-doc @@ -76,6 +80,9 @@ developing applications that use %{name}. %changelog +* Tue Dec 07 2021 Ondrej Holy - 0.4.1-2 +- Fix extraction of raw format archives + * Mon Nov 01 2021 Kalev Lember - 0.4.1-1 - Update to 0.4.1