diff --git a/qatapp-32528-fix-large-files.patch b/qatapp-32528-fix-large-files.patch new file mode 100644 index 0000000..091e5db --- /dev/null +++ b/qatapp-32528-fix-large-files.patch @@ -0,0 +1,63 @@ +From 906ff19a0bc4d770d0d8cd484bdce8d5fbb1843f Mon Sep 17 00:00:00 2001 +From: Xinghong Chen +Date: Wed, 31 Jul 2024 22:57:09 -0400 +Subject: [PATCH] QATAPP-32528: Fixed the qzip decompress large file issue +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Content-type: text/plain + +* The “bytes_processed” only updated when “DATA_ERROR/BUF_ERROR” +happened. It’s OK if during each “src buffer”, it would run into +“DATA_ERROR/BUF_ERROR” (This is the majority of cases, for 512M +src buffer, it almost always have “incomplete source buffer” +return). It’s also ok, if for each “src buffer”, it never run into +“DATA_ERROR/BUF_ERROR”, so it wouldn’t call “fseek”, +then bytes_processed is useless. But, if we mix those tow scenarios, +For some “src buffer” run into “DATA_ERROR/BUF_ERROR” and +others don’t. Then “bytes_processed” will miss some process +source for which complete decompression without error issue. +It cause the “fseek” set to incorrect file stream position. + +Signed-off-by: Xinghong Chen +Signed-off-by: David Qian +Signed-off-by: Vladis Dronov +--- + utils/qzip.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/utils/qzip.c b/utils/qzip.c +index bd69858..63d3702 100644 +--- a/utils/qzip.c ++++ b/utils/qzip.c +@@ -255,7 +255,8 @@ void doProcessFile(QzSession_T *sess, const char *src_file_name, + FILE *src_file = NULL; + FILE *dst_file = NULL; + unsigned int bytes_read = 0; +- unsigned long bytes_processed = 0; ++ unsigned int bytes_lookahead = 0; ++ long offset_revert = 0; + unsigned int ratio_idx = 0; + const unsigned int ratio_limit = + sizeof(g_bufsz_expansion_ratio) / sizeof(unsigned int); +@@ -326,14 +327,15 @@ void doProcessFile(QzSession_T *sess, const char *src_file_name, + + puts((is_compress) ? "Compressing..." : "Decompressing..."); + ++ bytes_lookahead = bytes_read; + ret = doProcessBuffer(sess, src_buffer, &bytes_read, dst_buffer, + dst_buffer_size, time_list_head, dst_file, + &dst_file_size, is_compress); + + if (QZ_DATA_ERROR == ret || QZ_BUF_ERROR == ret) { +- bytes_processed += bytes_read; + if (0 != bytes_read) { +- if (-1 == fseek(src_file, bytes_processed, SEEK_SET)) { ++ offset_revert = (long)bytes_read - (long)bytes_lookahead; ++ if (-1 == fseek(src_file, offset_revert, SEEK_CUR)) { + ret = ERROR; + goto exit; + } +-- +2.49.0 + diff --git a/qatzip.spec b/qatzip.spec index 2d5c051..74eaa72 100644 --- a/qatzip.spec +++ b/qatzip.spec @@ -5,7 +5,7 @@ Name: qatzip Version: 1.1.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Intel QuickAssist Technology (QAT) QATzip Library License: BSD-3-Clause URL: https://github.com/intel/%{githubname} @@ -19,6 +19,8 @@ BuildRequires: autoconf automake libtool make lz4-devel # https://bugzilla.redhat.com/show_bug.cgi?id=1987280 ExclusiveArch: x86_64 +Patch1: qatapp-32528-fix-large-files.patch + %description QATzip is a user space library which builds on top of the Intel QuickAssist Technology user space library, to provide extended @@ -46,7 +48,7 @@ This package contains headers and libraries required to build applications that use the QATzip APIs. %prep -%autosetup -n %{githubname}-%{version} +%autosetup -p1 -n %{githubname}-%{version} %build %set_build_flags @@ -86,6 +88,9 @@ rm -vf %{buildroot}%{_mandir}/*.pdf %{_libdir}/pkgconfig/*.pc %changelog +* Mon Apr 07 2025 Vladis Dronov - 1.1.2-3 +- Fix large files decompression bug QATAPP-32528 (RHEL-35325) + * Mon Nov 20 2023 Vladis Dronov - 1.1.2-2 - Rebuild qatzip 1.1.2 for qatlib 23.11 (RHEL-15637)