mirror of
https://github.com/tumic0/QtPBFImagePlugin.git
synced 2025-07-28 17:54:24 +02:00
Only accept PBF gziped files in canRead()
This commit is contained in:
66
src/gzip.cpp
66
src/gzip.cpp
@ -3,33 +3,57 @@
|
||||
#include <zlib.h>
|
||||
#include "gzip.h"
|
||||
|
||||
#define CHUNK 16384
|
||||
|
||||
QByteArray Gzip::uncompress(const QByteArray &data)
|
||||
QByteArray Gzip::uncompress(QIODevice *device, qint64 limit)
|
||||
{
|
||||
int ret;
|
||||
z_stream strm;
|
||||
unsigned char in[CHUNK];
|
||||
unsigned char out[CHUNK];
|
||||
qint64 rs;
|
||||
QByteArray uba;
|
||||
z_stream stream;
|
||||
|
||||
quint32 *size = (quint32*)(data.constData() + data.size() - sizeof(quint32));
|
||||
uba.resize(qFromLittleEndian(*size));
|
||||
|
||||
stream.zalloc = Z_NULL;
|
||||
stream.zfree = Z_NULL;
|
||||
stream.opaque = Z_NULL;
|
||||
strm.zalloc = Z_NULL;
|
||||
strm.zfree = Z_NULL;
|
||||
strm.opaque = Z_NULL;
|
||||
strm.avail_in = 0;
|
||||
strm.next_in = Z_NULL;
|
||||
if (inflateInit2(&strm, MAX_WBITS + 16) != Z_OK)
|
||||
return QByteArray();
|
||||
|
||||
stream.next_in = (Bytef*)data.constData();
|
||||
stream.avail_in = data.size();
|
||||
stream.next_out = (Bytef*)uba.data();
|
||||
stream.avail_out = uba.size();
|
||||
do {
|
||||
rs = device->read((char*)in, CHUNK);
|
||||
if (rs < 0) {
|
||||
(void)inflateEnd(&strm);
|
||||
return QByteArray();
|
||||
} else if (rs == 0)
|
||||
break;
|
||||
else
|
||||
strm.avail_in = (uInt)rs;
|
||||
strm.next_in = in;
|
||||
|
||||
if (inflateInit2(&stream, MAX_WBITS + 16) != Z_OK)
|
||||
return uba;
|
||||
do {
|
||||
strm.avail_out = CHUNK;
|
||||
strm.next_out = out;
|
||||
ret = inflate(&strm, Z_NO_FLUSH);
|
||||
Q_ASSERT(ret != Z_STREAM_ERROR);
|
||||
switch (ret) {
|
||||
case Z_NEED_DICT:
|
||||
case Z_DATA_ERROR:
|
||||
case Z_MEM_ERROR:
|
||||
(void)inflateEnd(&strm);
|
||||
return QByteArray();
|
||||
}
|
||||
uba.append((char*)out, CHUNK - strm.avail_out);
|
||||
if (limit && uba.size() >= limit) {
|
||||
(void)inflateEnd(&strm);
|
||||
return uba;
|
||||
}
|
||||
} while (!strm.avail_out);
|
||||
} while (ret != Z_STREAM_END);
|
||||
|
||||
if (inflate(&stream, Z_NO_FLUSH) != Z_STREAM_END) {
|
||||
qCritical() << "Invalid gzip data";
|
||||
uba = QByteArray();
|
||||
}
|
||||
|
||||
inflateEnd(&stream);
|
||||
|
||||
return uba;
|
||||
(void)inflateEnd(&strm);
|
||||
return (ret == Z_STREAM_END) ? uba : QByteArray();
|
||||
}
|
||||
|
Reference in New Issue
Block a user