kutils: ensure the initial KDecompressor buffer size is never zero

fixes decoding of long xz data

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-03-23 08:51:49 +02:00
parent 891458c94a
commit cf842d6705
2 changed files with 9 additions and 9 deletions

View file

@ -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;

View file

@ -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();