Fix extraction of raw format archives
Related: #2029425
(cherry picked from Fedora commit 2b08be5686
)
This commit is contained in:
parent
3287826e2e
commit
dab0cacb12
108
extractor-Fix-extraction-of-raw-format-archives.patch
Normal file
108
extractor-Fix-extraction-of-raw-format-archives.patch
Normal file
@ -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
|
||||||
|
|
44
extractor-Fix-extraction-to-root-directory.patch
Normal file
44
extractor-Fix-extraction-to-root-directory.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From 7237276439281abfedd619ecf6f5c17fae411137 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
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
|
||||||
|
|
@ -1,12 +1,16 @@
|
|||||||
Name: gnome-autoar
|
Name: gnome-autoar
|
||||||
Version: 0.4.1
|
Version: 0.4.1
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
Summary: Archive library
|
Summary: Archive library
|
||||||
|
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: https://git.gnome.org/browse/gnome-autoar
|
URL: https://git.gnome.org/browse/gnome-autoar
|
||||||
Source0: https://download.gnome.org/sources/gnome-autoar/0.4/gnome-autoar-%{version}.tar.xz
|
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: gcc
|
||||||
BuildRequires: meson
|
BuildRequires: meson
|
||||||
BuildRequires: gtk-doc
|
BuildRequires: gtk-doc
|
||||||
@ -76,6 +80,9 @@ developing applications that use %{name}.
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Dec 07 2021 Ondrej Holy <oholy@redhat.com> - 0.4.1-2
|
||||||
|
- Fix extraction of raw format archives
|
||||||
|
|
||||||
* Mon Nov 01 2021 Kalev Lember <klember@redhat.com> - 0.4.1-1
|
* Mon Nov 01 2021 Kalev Lember <klember@redhat.com> - 0.4.1-1
|
||||||
- Update to 0.4.1
|
- Update to 0.4.1
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user