From cf842d6705766cfdc2f5ee1ec6d38e61b09b74ac Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sat, 23 Mar 2024 08:51:49 +0200 Subject: [PATCH] kutils: ensure the initial KDecompressor buffer size is never zero fixes decoding of long xz data Signed-off-by: Ivailo Monev --- kutils/karchive/kcompressor.cpp | 10 +++++----- kutils/karchive/kdecompressor.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/kutils/karchive/kcompressor.cpp b/kutils/karchive/kcompressor.cpp index 237fcca6..adbfeb78 100644 --- a/kutils/karchive/kcompressor.cpp +++ b/kutils/karchive/kcompressor.cpp @@ -33,7 +33,7 @@ #endif // space for headers in the worst case scenario -static const ushort s_headersize = 256; +#define KCOMPRESSOR_HEADERSIZE 256 class KCompressorPrivate { @@ -98,7 +98,6 @@ int KCompressor::level() const bool KCompressor::setLevel(const int level) { - d->m_errorstring.clear(); if (Q_UNLIKELY(level < 0 || level > 9)) { d->m_errorstring = i18n("Compression level not in the 0-9 range: %1", level); return false; @@ -108,6 +107,7 @@ bool KCompressor::setLevel(const int level) d->m_errorstring = i18n("Compression level not in the 1-9 range: %1", level); return false; } + d->m_errorstring.clear(); d->m_level = level; return true; } @@ -132,7 +132,7 @@ bool KCompressor::process(const QByteArray &data) return false; } - d->m_result.resize(data.size() + s_headersize); + d->m_result.resize(data.size() + KCOMPRESSOR_HEADERSIZE); size_t compresult = 0; switch (d->m_type) { @@ -179,7 +179,7 @@ bool KCompressor::process(const QByteArray &data) } #if defined(HAVE_BZIP2) case KCompressor::TypeBZip2: { - d->m_result.resize(data.size() + s_headersize); + d->m_result.resize(data.size() + KCOMPRESSOR_HEADERSIZE); uint compsize = d->m_result.size(); const int compresult = BZ2_bzBuffToBuffCompress( @@ -200,7 +200,7 @@ bool KCompressor::process(const QByteArray &data) #endif // HAVE_BZIP2 #if defined(HAVE_LIBLZMA) case KCompressor::TypeXZ: { - d->m_result.resize(data.size() + s_headersize); + d->m_result.resize(data.size() + KCOMPRESSOR_HEADERSIZE); size_t compsize = d->m_result.size(); lzma_stream comp = LZMA_STREAM_INIT; diff --git a/kutils/karchive/kdecompressor.cpp b/kutils/karchive/kdecompressor.cpp index abede199..096f2549 100644 --- a/kutils/karchive/kdecompressor.cpp +++ b/kutils/karchive/kdecompressor.cpp @@ -70,7 +70,6 @@ KDecompressor::KDecompressorType KDecompressor::type() const bool KDecompressor::setType(const KDecompressorType type) { - d->m_errorstring.clear(); if (type == KDecompressor::TypeUnknown) { d->m_errorstring = i18n("Invalid type: %1", int(type)); return false; @@ -87,6 +86,7 @@ bool KDecompressor::setType(const KDecompressorType type) return false; } #endif + d->m_errorstring.clear(); d->m_type = type; return true; } @@ -104,7 +104,7 @@ bool KDecompressor::process(const QByteArray &data) case KDecompressor::TypeDeflate: case KDecompressor::TypeZlib: case KDecompressor::TypeGZip: { - size_t speculativesize = (data.size() * 2); + size_t speculativesize = (data.size() * 2 + KDECOMPRESSOR_BUFFSIZE); if (Q_UNLIKELY(speculativesize >= KDECOMPRESSOR_BUFFMAX)) { d->m_errorstring = i18n("Input data size too big: %1", data.size()); d->m_result.clear(); @@ -177,7 +177,7 @@ bool KDecompressor::process(const QByteArray &data) } #if defined(HAVE_BZIP2) case KDecompressor::TypeBZip2: { - uint speculativesize = (data.size() * 2); + uint speculativesize = (data.size() * 2 + KDECOMPRESSOR_BUFFSIZE); if (Q_UNLIKELY(speculativesize >= KDECOMPRESSOR_BUFFMAX)) { d->m_errorstring = i18n("Input data size too big: %1", data.size()); d->m_result.clear(); @@ -214,7 +214,7 @@ bool KDecompressor::process(const QByteArray &data) #endif // HAVE_BZIP2 #if defined(HAVE_LIBLZMA) case KDecompressor::TypeXZ: { - size_t speculativesize = (data.size() * 2); + size_t speculativesize = (data.size() * 2 + KDECOMPRESSOR_BUFFSIZE); if (Q_UNLIKELY(speculativesize >= KDECOMPRESSOR_BUFFMAX)) { d->m_errorstring = i18n("Input data size too big: %1", data.size()); d->m_result.clear();