From f4e9c6b56202436f4f2278835a07e221be2e5bea Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 21 Oct 2024 17:56:34 +0000 Subject: [PATCH] archive: Fix passing error codes when opening the archive Signed-off-by: Michael Tremer --- src/libpakfire/archive.c | 87 +++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 5539d5109..f20f93c8b 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -203,29 +203,18 @@ ERROR: return ARCHIVE_FATAL; } -static int pakfire_archive_compute_digests(struct pakfire_archive* archive) { - int r; - - // Start reading at the beginning - rewind(archive->f); - - // Calculate digest - r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests, - PAKFIRE_ARCHIVE_CHECKSUM, archive->f); - if (r) - CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path); - - return r; -} - /* A helper function that opens the archive for reading */ -static struct archive* open_archive(struct pakfire_archive* archive) { +static int pakfire_archive_open_archive(struct pakfire_archive* archive, + struct archive** __archive) { + struct archive* a = NULL; + int r; + // Create a new archive object - struct archive* a = archive_read_new(); + a = archive_read_new(); if (!a) - return NULL; + return -errno; // Archives must be uncompressed tarballs archive_read_support_format_tar(a); @@ -234,21 +223,39 @@ static struct archive* open_archive(struct pakfire_archive* archive) { archive_read_support_filter_zstd(a); // Try opening the archive file - int r = archive_read_file_open(a, archive->f); - if (r) + r = archive_read_file_open(a, archive->f); + if (r) { + CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n", + archive->path, archive_error_string(a)); goto ERROR; + } + + // Return pointer + *__archive = a; // Success - return a; + return 0; ERROR: - CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n", - archive->path, archive_error_string(a)); - if (a) archive_read_free(a); - return NULL; + return r; +} + +static int pakfire_archive_compute_digests(struct pakfire_archive* archive) { + int r; + + // Start reading at the beginning + rewind(archive->f); + + // Calculate digest + r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests, + PAKFIRE_ARCHIVE_CHECKSUM, archive->f); + if (r) + CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path); + + return r; } /* @@ -344,9 +351,9 @@ static int pakfire_archive_open_and_walk(struct pakfire_archive* archive, int r; // Open the archive - a = open_archive(archive); - if (!a) - return -errno; + r = pakfire_archive_open_archive(archive, &a); + if (r < 0) + goto ERROR; // Walk... r = pakfire_archive_walk(archive, a, walk_callback, filter_callback, data); @@ -613,11 +620,9 @@ static int pakfire_archive_read_metadata(struct pakfire_archive* archive) { CTX_DEBUG(archive->ctx, "Reading archive metadata...\n"); // Open the archive - a = open_archive(archive); - if (!a) { - r = -errno; + r = pakfire_archive_open_archive(archive, &a); + if (r < 0) goto ERROR; - } // Check if the archive file actually has any contect if (!archive->stat.st_size) { @@ -936,8 +941,8 @@ PAKFIRE_EXPORT FILE* pakfire_archive_read(struct pakfire_archive* archive, const archive_read_free(cookie->a); // Open the archive - cookie->a = open_archive(archive); - if (!cookie->a) + r = pakfire_archive_open_archive(archive, &cookie->a); + if (r < 0) goto ERROR; // Walk through the archive @@ -1252,11 +1257,9 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, const char } // Open the archive - a = open_archive(archive); - if (!a) { - r = -errno; + r = pakfire_archive_open_archive(archive, &a); + if (r < 0) goto ERROR; - } // Setup the writer if we are not running in dry mode if (!(flags & PAKFIRE_EXTRACT_DRY_RUN)) { @@ -1815,15 +1818,17 @@ ERROR: int pakfire_archive_apply_systemd_sysusers(struct pakfire_archive* archive) { struct archive* a = NULL; + int r; // Open the archive - a = open_archive(archive); - if (!a) - return -errno; + r = pakfire_archive_open_archive(archive, &a); + if (r < 0) + goto ERROR; pakfire_archive_walk(archive, a, pakfire_archive_handle_systemd_sysusers, pakfire_archive_filter_systemd_sysusers, NULL); +ERROR: if (a) archive_read_free(a); -- 2.39.5