From: Michael Tremer Date: Tue, 6 Apr 2021 18:15:54 +0000 (+0000) Subject: archive: Use extraction function from libarchive X-Git-Tag: 0.9.28~1285^2~415 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d1383cb53ceb1b86c1f4e62be029ea8877f67f6;p=pakfire.git archive: Use extraction function from libarchive Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index e9ae3bd93..2eabaa2a1 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -84,9 +84,6 @@ struct _PakfireArchive { struct pakfire_scriptlet** scriptlets; size_t nscriptlets; - // OpenSSL - EVP_MD_CTX* mdctx; - int nrefs; }; @@ -351,10 +348,6 @@ static void pakfire_archive_free(PakfireArchive archive) { // Free all checksums pakfire_archive_free_chksums(archive); - // Release OpenSSL context - if (archive->mdctx) - EVP_MD_CTX_free(archive->mdctx); - if (archive->path) free(archive->path); @@ -714,81 +707,6 @@ PAKFIRE_EXPORT char* pakfire_archive_get(PakfireArchive archive, const char* nam return pakfire_parser_get(archive->parser, namespace, key); } -static int archive_copy_data(PakfireArchive archive, struct archive* in, struct archive* out, - char** hexdigest) { - int r; - - // Create or reset OpenSSL context - if (archive->mdctx) { - r = EVP_MD_CTX_reset(archive->mdctx); - if (r != 1) { - ERROR(archive->pakfire, "Could not reset EVP_MD_CTX: %s\n", - ERR_error_string(ERR_get_error(), NULL)); - return 1; - } - } else { - archive->mdctx = EVP_MD_CTX_new(); - } - - // Initialize digest - r = EVP_DigestInit_ex(archive->mdctx, EVP_blake2s256(), NULL); - if (r != 1) { - ERROR(archive->pakfire, "Could not setup digest function: %s\n", - ERR_error_string(ERR_get_error(), NULL)); - return 1; - } - - const void* buffer; - size_t size; - off_t offset; - - for (;;) { - // Read a block of data - r = archive_read_data_block(in, &buffer, &size, &offset); - if (r == ARCHIVE_EOF) - break; - - if (r != ARCHIVE_OK) { - ERROR(archive->pakfire, "Could not read data from archive: %s\n", - archive_error_string(in)); - return 1; - } - - // Update digest - r = EVP_DigestUpdate(archive->mdctx, buffer, size); - if (r != 1) { - ERROR(archive->pakfire, "EVP_DigestUpdate failed: %s\n", - ERR_error_string(ERR_get_error(), NULL)); - return 1; - } - - // Write the data - r = archive_write_data_block(out, buffer, size, offset); - if (r != ARCHIVE_OK) { - ERROR(archive->pakfire, "Could not write data to disk: %s\n", - archive_error_string(out)); - return 1; - } - } - - char digest[EVP_MAX_MD_SIZE]; - size_t digest_length = 0; - - // Finalize the digest - r = EVP_DigestFinal_ex(archive->mdctx, (unsigned char*)digest, (unsigned int*)&digest_length); - if (r != 1) { - ERROR(archive->pakfire, "%s\n", ERR_error_string(ERR_get_error(), NULL)); - return 1; - } - - // Convert to hex - *hexdigest = pakfire_hexlify(digest, digest_length); - - DEBUG(archive->pakfire, "Computed digest of %zu bytes: %s\n", digest_length, *hexdigest); - - return 0; -} - static la_int64_t archive_user_lookup(void* data, const char* name, la_int64_t uid) { Pakfire pakfire = (Pakfire)data; @@ -845,7 +763,8 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char ARCHIVE_EXTRACT_SPARSE | ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_UNLINK | - ARCHIVE_EXTRACT_XATTR; + ARCHIVE_EXTRACT_XATTR | + ARCHIVE_EXTRACT_SECURE_SYMLINKS; archive_write_disk_set_options(ext, flags); @@ -893,60 +812,21 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char free(h); } - // Create file - r = archive_write_header(ext, entry); + // Create file & payload + r = archive_read_extract2(a, entry, ext); if (r != ARCHIVE_OK) { ERROR(archive->pakfire, "Could not extract file /%s: %s\n", archive_pathname, archive_error_string(ext)); + pakfire_file_unref(file); break; } - // Copy payload - if (size > 0) { - char* hexdigest = NULL; - - r = archive_copy_data(archive, a, ext, &hexdigest); - if (r != ARCHIVE_OK) - break; - - // Set checksum - if (hexdigest) { - pakfire_file_set_chksum(file, hexdigest); - free(hexdigest); - } - } - // Append file to filelist r = pakfire_filelist_append(archive->filelist, file); if (r) break; pakfire_file_unref(file); - - // Commit to disk - r = archive_write_finish_entry(ext); - switch (r) { - case ARCHIVE_OK: - continue; - - // A retry of this action might be successful - case ARCHIVE_RETRY: - r = archive_write_finish_entry(ext); - break; - - case ARCHIVE_WARN: - DEBUG(archive->pakfire, "/%s: %s\n", - archive_pathname, archive_error_string(ext)); - continue; - - case ARCHIVE_FAILED: - ERROR(archive->pakfire, "/%s: %s\n", - archive_pathname, archive_error_string(ext)); - break; - } - - if (r != ARCHIVE_OK) - break; } archive_write_close(ext);