mirror of
https://bitbucket.org/smil3y/kdelibs.git
synced 2025-02-23 10:22:48 +00:00
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:
parent
891458c94a
commit
cf842d6705
2 changed files with 9 additions and 9 deletions
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue